远程第三方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(...)),
...
]环境:
发布于 2014-03-04 13:44:59
最简单的方法是重写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方法循环每个结果。window[result.class] )model来构造/更新模型实例。can.List并返回它。我已经在CanJS 2.0.x中测试了这一点,并且在这里工作得很好。
您可以在文档中找到有关这一切如何工作的更多详细信息:
看来,在CanJS 2.1.0中,这些建议将被否决,以支持.parseModels和.parseModel。
https://stackoverflow.com/questions/18276195
复制相似问题