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 月的这次提交之后,不再可能在对象创建期间设置观察者。这导致了巨大的性能胜利。

要在创建时设置观察者,您需要使用:

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

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

API 文档应该相应地更新,我稍后会做一些事情。

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

也就是说,您正在做的两件事违背了 Ember 的概念:

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

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

    当 App 初始化时,Ember 会为你生成控制器。

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

    模型和控制器将通过路由交互。

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

于 2013-05-09T10:33:13.707 回答