首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CanJS对象列表自动子类和重分类

CanJS对象列表自动子类和重分类
EN

Stack Overflow用户
提问于 2013-08-16 14:52:56
回答 1查看 199关注 0票数 3

远程第三方JSONP服务器为我的CanJS脚本提供了如下结果的列表:

代码语言:javascript
复制
[
    { "class": "ABaseClass", "value": "1"},
    { "class": "ASubClass", "value": "2"},
    { "class": "ABaseClass", "value": "3"},
    { "class": "ASubClass", "value": "4"}, 
    ...
]

其中type是预期的对象类,在CanJS中使用can.Model.extend定义

以下简化代码演示了CanJS设置:

代码语言:javascript
复制
ABaseClass = can.Model.extend({ ... }, {
    'findAll': { 'url': 'the url', 'dataType': "jsonp" }
    // this is modified source code and may not run
});

// ASubClass is a subclass of ABaseClass.
ASubClass = ABaseClass.extend({ ... }, { ... });

问题:

当调用ABaseClass.findAll({}, function(data) { ... }) (调用JSONP端点以获取更多对象)时,回调将获得CanJS模型的列表,但只能获得类ABaseClass的列表。

问题:

是否有一个由CanJS提供的助手方法来根据对象列表中的字段自动创建子类?如果没有,我该如何实现呢?

预期产出:

代码语言:javascript
复制
[
    (new ABaseClass(...)),
    (new ASubClass(...)),
    (new ABaseClass(...)),
    (new ASubClass(...)),
    ...
]

环境:

  • CanJS: 1.17
  • jQuery: 1.10.1
  • 我无法控制端点返回的对象类型。
  • 多个AJAX调用不是一个可接受的解决方案。
EN

回答 1

Stack Overflow用户

发布于 2014-03-04 13:44:59

最简单的方法是重写models方法并为类找到正确的模型,如下所示:

代码语言:javascript
复制
ABaseClass = can.Model.extend('ABaseClass', {
    'findAll': { url: "/the_url", dataType: "jsonp" },
    models: function(results){
        return_models = new can.List();
        can.each(results, function(result){
            return_models.push( window[result.class].model(result.value) )
        })
        return return_models;
    }
}, {});

ASubClass = ABaseClass.extend('ASubClass', {}, {});

ABaseClass.findAll({}, function(results){
    console.log(results);
})

这样做的目的是:

  1. findAll返回时,它将其结果发送给models方法。
  2. 然后,models方法循环每个结果。
  3. 然后,它会找到附加到窗口的模型构造函数。( window[result.class] )
  4. 然后,我们在构造函数上调用model来构造/更新模型实例。
  5. 将模型实例添加到can.List并返回它。

我已经在CanJS 2.0.x中测试了这一点,并且在这里工作得很好。

您可以在文档中找到有关这一切如何工作的更多详细信息:

  • http://canjs.com/docs/can.Model.models.html
  • http://canjs.com/docs/can.Model.model.html

看来,在CanJS 2.1.0中,这些建议将被否决,以支持.parseModels.parseModel

  • http://www.bitovi.com/blog/2014/02/canjs-infrastructure-improvements.html#perpetual-beta-pre-releases
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18276195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档