3

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

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

typeCanJS 中定义的预期对象类在哪里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 模型的列表,但只有 class ABaseClass

问题:

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


预期输出:

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

环境:

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

1 回答 1

0

最简单的方法是重写该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. 然后它会找到附加到窗口的模型构造函数。( window[result.class])
  4. 然后我们调用model构造函数来构造/更新模型实例。
  5. 将模型实例添加到 acan.List并返回它。

我已经在 CanJS 2.0.x 中对此进行了测试,它在这里运行良好。

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

看起来这些将在 CanJS 2.1.0 中被弃用,以支持.parseModels.parseModel

于 2014-03-04T13:44:59.343 回答