CanJS对象列表自动进行子类化和重类化
CanJS object list automatic subclassing and reclassing
远程第三方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
方法然后在每个结果上循环- 然后它会找到附加到窗口的模型构造函数。(
window[result.class]
) - 然后我们在构造函数上调用
model
来构造/更新模型实例 - 将模型实例添加到
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-测试版预发布
相关文章:
- JavaScript—父类和子类/对象的此问题
- Javascript:将类/对象引用设置为 NULL,内存中的子对象/类会发生什么
- javascript对象继承-子类和超类
- 在fabric.js中初始化对象创建的子类
- 创建新的子类对象时设置父类中定义的变量时出现问题
- Javascript子类对象不保留基类的属性/方法
- 查询后 javascript 属性中 parse.com 对象的子类
- 如何检查 JavaScript 对象是否直接是“{}”实例,而不是子类
- 无法访问 JavaScript 对象中的静态变量,该对象对另一个 JavaScript 对象进行子类化
- 使用 for 循环通过 Parse 创建子类对象
- CanJS对象列表自动进行子类化和重类化
- 为什么子类数组的JSON字符串化是一个对象
- 为什么基类的对象属性与子类的所有实例共享?
- 使用现有对象的引用创建子类对象
- 如何获取对象's类名,当它是子类的实例时
- 当子类继承超类时,为什么要重置对象构造函数?
- Javascript:是否可以将新函数注入基类/对象'这将在所有子类/对象'
- 子类化本机对象
- Javascript”;延伸“;子对象或子类中的方法
- fabricjs子类化对象没有分组