我只是潜入Ember。我正在寻找一种方法将一个普通的vanilla对象数组传递给一个集合/控制器,并让它们类型转换为正确的模型。
这是简单的集合视图:
{{#collection id="prods" contentBinding="Vix.prodsController" tagName="ul"}}
{{content.title}}
{{/collection}}
以下是模型:
Vix.Prod = Ember.Object.extend({
id: null,
title: null
});
控制器:
Vix.prodsController = Ember.ArrayController.create({
content: []
});
然后让我们从服务器获取一些JSON格式的数据。在这个例子中,我只是硬编码:
var prods = [{id:"yermom1", title:"yermom 1"}, {id:"yermom2", title:"yermom 2"}]
Vix.prodsController.set('content', prods);
到目前为止一切顺利。我得到了li
元素的简单列表,显示了我期望的标题。但是当我想更新其中一个对象的标题时,使用:
Vix.prodsController.objectAt(0).set('title', 'new title')
它抱怨因为该对象没有set
方法 - 它没有被正确地转换为我的Vix.Prod
Ember对象。
使用此备选方案:
Vix.prodsController.pushObjects(prods);
产生相同的结果。只有当我明确创建新的模型实例时,我才能获得get/set
善良:
var prods = [Vix.Prod.create({id:"yermom1", title:"yermom 1"}), {Vix.Prod.create(id:"yermom2", title:"yermom 2"})]
有没有办法自动将这些vanilla对象类型转换为我的Vix.Prod Ember对象?如果没有,我是唯一真正想要这样的人吗?在Backbone中,可以在集合上设置model
属性。我想我可以在我的控制器上创建一个setter来做类似的事情 - 只是想知道是否有一些我内省的内容。谢谢!
答案 0 :(得分:2)
没有魔力。我建议做一个环绕模型的循环。
var prods = [{id:"yermom1", title:"yermom 1"}, {id:"yermom2", title:"yermom 2"}];
for (var i = 0; i < prods.length; i++) {
prods[i] = Vix.Prod.create(prods[i]);
}
答案 1 :(得分:1)
如果我尽可能多地使用余烬,我会想要一条捷径。所以这就是我现在所做的。我创建了一个用于创建集合/控制器的基本Collection类:
Vix.Collection = Ember.ArrayController.extend({
model: null,
pushObject: function(obj) {
if (this.get('model') && obj.__proto__.constructor !== this.get('model')) {
obj = this.get('model').create(obj);
}
return this._super(obj);
},
pushObjects: function(objs) {
if (this.get('model')) {
objs = this._typecastArray(objs)
}
return this._super(objs);
},
set: function(prop, val) {
if (prop === 'content' && this.get('model')) {
val = this._typecastArray(val);
}
return this._super(prop, val);
},
_typecastArray: function(objs) {
var typecasted = [];
objs.forEach(function(obj){
if (obj.__proto__.constructor !== this.get('model')) {
obj = this.get('model').create(obj);
}
typecasted.push(obj);
}, this);
return typecasted;
}
})
现在,当我调用pushObject
,pushObjects
或.set('collection', data)
时,如果集合实例具有已定义的model
属性,并且添加到集合中的对象不是已经是那种类型,他们将被铸造。到目前为止一直很好,但我欢迎任何反馈。
答案 2 :(得分:0)
你应该看看余烬数据:https://github.com/emberjs/data
它似乎符合您的需求......
截至今天,它尚未准备就绪(如自述文件中所述),但由于积极的发展,它正在迅速趋于成熟。