将香草对象自动类型转换为Ember对象

时间:2012-02-28 20:25:37

标签: ember.js

我只是潜入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来做类似的事情 - 只是想知道是否有一些我内省的内容。谢谢!

3 个答案:

答案 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;
  }

})

现在,当我调用pushObjectpushObjects.set('collection', data)时,如果集合实例具有已定义的model属性,并且添加到集合中的对象不是已经是那种类型,他们将被铸造。到目前为止一直很好,但我欢迎任何反馈。

答案 2 :(得分:0)

你应该看看余烬数据:https://github.com/emberjs/data

它似乎符合您的需求......

截至今天,它尚未准备就绪(如自述文件中所述),但由于积极的发展,它正在迅速趋于成熟。