观察者不会在创建的对象上触发

Raj*_*jat 2 ember.js

我试图用观察者观察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'));
    }
});
Run Code Online (Sandbox Code Playgroud)

Jsfiddle:http://jsfiddle.net/gdXfN/26/

不确定控制台为什么不记录"对象上的数据属性已更改".如何在我的实例中覆盖"成功"fn,开放替代方法.

Ted*_*nny 5

在去年12月提交之后,在对象创建期间不再可能设置观察者.这导致了巨大的性能胜利.

要在create上设置观察者,您需要使用:

var Object = Object.createWithMixins({
  changed: function() {
  }.observes('data')
});
Run Code Online (Sandbox Code Playgroud)

这是一个证明这一点的小提琴.

API文档应该相应更新,稍后我会做.

但是,我不建议您这样做,而是在对象定义期间设置观察者.可以实现相同的结果:http://jsfiddle.net/teddyzeenny/gdXfN/32/

也就是说,你有两件事情与Ember概念背道而驰:

  1. 你不应该自己创建控制器实例,你应该让Ember为你创建它们:

    App.TopCampaignsController = Em.Controller.extend({ content: null });
    
    Run Code Online (Sandbox Code Playgroud)

    当应用程序初始化时,Ember将为您生成控制器.

  2. 模型不应该知道控制器的存在.控制器应该访问模型,而不是相反.

    模型和控制器将通过路径进行交互.

在最后两点,您可以在http://emberjs.com/guides/上观看教程,了解应用程序,控制器,模型和路由应如何交互.由于您没有使用Ember Data,因此请忽略DS.Model并想象一下Ember.Object.本教程可以很好地概述对象应该如何交互.