ember.js pushObject没有推动

时间:2012-08-06 13:50:12

标签: ember.js

让我的大脑缠绕在emberjs身上。尝试创建一个控制器,从一个返回JSON数组的webservice调用中加载对象:

(请注意,这是从coffeescript生成的javascript)

MTM.Trade.controller = Ember.ArrayController.create({
  loadAll: function() {
    var self;
    self = this;
    this.set('content', []); /* fails with or without this line*/
    return $.getJSON('http://localhost:8080/webservice/trades', function(data) {
      var jsonTrade, trade, _i, _len;
      console.log("Length = " + data.length);
      for (_i = 0, _len = data.length; _i < _len; _i++) {
        jsonTrade = data[_i];
        trade = MTM.Trade.create(jsonTrade);
        self.pushObject(trade);
      }
      console.log("Everything pushed");
    });
  }
});

在调用MTM.Trade.controller.loadAll()时,很明显正在为每个对象调用循环。但是我的控制器永远不会改变..运行console.log MTM.Trade.controller.get('content')会返回一个空白数组。

我知道ember-rest和ember-data存在,但是现在我正在自己学习如何自己做这些事情,并且稍后会迁移到这些框架。

更新

感谢this article我确实得到了我的问题的答案..我需要初始化我的数组:

MTM.Trade.controller = Ember.ArrayController.create({

  init: function() {
    this._super();
    return this.set('content', Ember.A());
  },

loadAll: function() {
    ...

所以现在我的问题是,为什么?直觉上ArrayController初始化器不应该处理这个问题吗?也许这不是预期使用ArrayController的方式?

1 个答案:

答案 0 :(得分:1)

在你更新之前,我发表评论,我告诉你在创建时初始化内容(所以在创建的哈希中)。

MTM.Trade.controller = Ember.ArrayController.create({
    content: [],
    //...
});

但后来我发现您在loadAll函数中将content设置为[]。所以我认为初始化是不必要的。

当看起来最接近ArrayController时,它只是ArrayProxy mixin的扩展(即:各种接口),因此在创建ArrayController的实例时,您必须定义content属性。