2

オブザーバーを使用して、XHR 後のモデルの変更を観察しようとしています。これは、fn を拡張して super を呼び出すという以前のアプローチが許可されなくなったためです。

私のオブザーバーが起動しないこの奇妙な問題に遭遇しました:

App = Ember.Application.create({
    ready: function () {
        console.log('Ember Application ready');
        this.topCampaignsController = Ember.ArrayController.create({
            content: null
        });

        App.TopCampaignsModel.create({
            // Calling super is no longer allowed in object instances
            //success: function () {
            //  this._super();
            //  App.topCampaignsController.set('content', this.get('data'));
            //},
            onDataChange: function () {
                console.log('data property on the object changed');
                App.topCampaignsController.set('content', this.get('data'));
            }.observes('data')
        });
    }
});

App.TopCampaignsModel = Ember.Object.extend({
    data: null,

    // this will be actually called from an XHR request
    success: function () {
        this.set('data', [5,10]);
    },

    init: function () {
        console.log('TopCampaignsModel created');
        this.success();
        console.log(this.get('data'));
    }
});

Jsfiddle はこちら: http://jsfiddle.net/gdXfN/26/

コンソールが「変更されたオブジェクトのデータ プロパティ」をログに記録しない理由がわかりません。私のインスタンスで「成功」fnをオーバーライドする方法について、代替アプローチを受け入れます。

4

1 に答える 1

5

昨年 12 月のこの commitの後、オブジェクトの作成中にオブザーバーを設定することはできなくなりました。これにより、パフォーマンスが大幅に向上しました。

作成時にオブザーバーを設定するには、次を使用する必要があります。

var Object = Object.createWithMixins({
  changed: function() {
  }.observes('data')
});

これを示すフィドルを次に示します。

それに応じて API ドキュメントを更新する必要があります。これについては後で行います。

ただし、そうすることはお勧めしませんが、代わりにオブジェクト定義中にオブザーバーを設定してください。同じ結果を得ることができます: http://jsfiddle.net/teddyzeenny/gdXfN/32/

とはいえ、Ember の概念に反する 2 つのことを行っています。

  1. コントローラー インスタンスを自分で作成しないでください。Ember に作成してもらう必要があります。

    App.TopCampaignsController = Em.Controller.extend({ content: null });
    

    アプリが初期化されると、Ember がコントローラーを生成します。

  2. モデルはコントローラの存在を認識すべきではありません。コントローラーはモデルにアクセスする必要があります。

    モデルとコントローラーは、ルートを介して相互作用します。

最後の 2 つの点については、http://emberjs.com/guides/でチュートリアルを見て、アプリケーション、コントローラー、モデル、およびルートがどのように相互作用するかを確認できます。Ember Data を使用していないので、無視して代わりにDS.Model想像してみてください。Ember.Objectこのチュートリアルでは、オブジェクトがどのように相互作用するかについての概要を説明しています。

于 2013-05-09T10:33:13.707 に答える