远程第三方 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);
})
它的作用是:
- 当
findAll
返回时,它会将其结果发送到models
方法。 models
方法然后循环遍历每个结果。- 然后找到附加到窗口的模型构造函数。 (
窗口[result.class]
) - 然后我们在构造函数上调用
model
来构造/更新模型实例。 - 将模型实例添加到
can.List
并返回它。
我已经在 CanJS 2.0.x 中测试过了,它在这里工作正常。
您可以在文档中找到有关这一切如何工作的更多详细信息:
看起来这些在 CanJS 2.1.0 中将被弃用,取而代之的是 .parseModels
和 .parseModel
关于javascript - CanJS 对象列表自动子类化和重分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18276195/