5

私の脳をemberjsに巻き込みます。JSON配列を返すWebサービス呼び出しからオブジェクトをロードするコントローラーを作成しようとしています:

(これは、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()、オブジェクトごとにループが呼び出されていることが明らかです。ただし、コントローラーは決して変更されません.. runningconsole.log MTM.Trade.controller.get('content')は空の配列を返します。

私は ember-rest と ember-data が存在することを知っていますが、今のところ、これらのことを自分で行う方法を自分で学んでおり、後でこれらのフレームワークに移行します。

アップデート

この記事のおかげで、質問に対する答えが得られました。配列を次のように初期化する必要があります。

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

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

loadAll: function() {
    ...

だから今私の質問は、なぜですか?直感的に、ArrayController初期化子がこれを処理するべきではありませんか? おそらく、これはArrayControllerが使用されると予想される方法ではありませんか?

4

1 に答える 1

1

更新の前に、作成時にコンテンツを初期化するように言ったコメントを入れました(作成のハッシュで)。

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

しかし、その後、loadAll 関数で に設定contentしていることがわかりました。[]なので初期化は不要と思っていました。

に最も近いものを見るとArrayController、これは単なる mixin の拡張ArrayProxy(つまり、インターフェイスの種類) にすぎないため、 のインスタンスを作成するときは、プロパティArrayControllerを定義する必要がありcontentます。

于 2012-08-06T14:28:22.520 に答える