javascript - CanJS 对象列表自动子类化和重分类

标签 javascript ajax canjs canjs-model canjs-list

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

[
    { "class": "ABaseClass", "value": "1"},
    { "class": "ASubClass", "value": "2"},
    { "class": "ABaseClass", "value": "3"},
    { "class": "ASubClass", "value": "4"}, 
    ...
]

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

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

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 提供的辅助方法来根据对象列表中的字段自动创建子类?如果没有,我该如何着手实现?


预期输出:

[
    (new ABaseClass(...)),
    (new ASubClass(...)),
    (new ABaseClass(...)),
    (new ASubClass(...)),
    ...
]

环境:

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

最佳答案

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

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. 然后找到附加到窗口的模型构造函数。 ( 窗口[result.class] )
  4. 然后我们在构造函数上调用model来构造/更新模型实例。
  5. 将模型实例添加到 can.List 并返回它。

我已经在 CanJS 2.0.x 中测试过了,它在这里工作正常。

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

看起来这些在 CanJS 2.1.0 中将被弃用,取而代之的是 .parseModels.parseModel

关于javascript - CanJS 对象列表自动子类化和重分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18276195/

相关文章:

javascript - 传单弹出窗口在第一次关闭时清除内容

javascript - CanJS 添加自定义 MODEL 方法

javascript - 尝试在 AngularJS 中创建多重过滤器以按月份和年份 ID 过滤 JSON 数据

javascript - 如何在单击按钮时更改 div 的文本内容?普通 JS/Jquery

javascript - 使用 bootstrap 选项卡时如何修复 Google 图表的高度和宽度?

javascript - 我尝试过此控制台问题。 TypeError : Failed to execute 'appendChild' on 'Node' : parameter 1 is not of type 'Node'

javascript - 检查在 ajax 成功函数中不起作用的 div 的可见性

javascript - JSON 解码不适用于 PHP

javascript - Google Maps Javascript - 计算航向和 compass 方向以计算面向方向

javascript - undefined 不是 canjs 中的函数