isLoaded观察者不会在正确的时间开火

时间:2013-03-20 10:16:49

标签: ember.js ember-data

我认为我做错了但我不知道是什么。

当我的应用程序加载时,它需要检索所有公司,当它们到达时,它需要在我的activeCompany上设置属性ApplicationController。但是当我在content.isLoadedCompaniesController上绑定一个观察者时,会在数据加载之前触发。

应用

App = Ember.Application.create({
    ApplicationController : Ember.Controller.extend({
        needs: ['companies'],
        activeCompany: null,
        activateCompany: function(company) {
            this.set('activeCompany',company);
        }
    })
});

路由器

App.ApplicationRoute = Ember.Route.extend({
    enableLogging : true,
    setupController: function(controller, model) {
        this.controllerFor('companies').set('content', App.Company.find());
    }
});

CompaniesController

App.CompaniesController = Em.ArrayController.extend({
    needs: ['application'],
    activateCompany: function() {
        console.log(this.get('content.length')); // 0
        console.log(this.get('content.isLoaded')); // true
        console.log(this.get('content.firstObject')); // undefined
        this.get('controllers.application').activateCompany(this.get('content.firstObject'));
    }.observes('content.isLoaded')
});

为什么content.isLoaded在未加载数据时会触发?

也许我的概念是错误的,但我的应用程序的其余部分依赖于activeCompany来检索其他数据。我还有一个'公司切换器',它也设置了activeCompany属性。

当我将观察者更改为content.@each时,会触发数组中的所有项目。

修改

我可以这样解决:

App.CompaniesController = Em.ArrayController.extend({
    needs: ['application'],
    activateCompany: function() {
        if (this.get('content.length') > 0)
            this.get('controllers.application').activateCompany(this.get('content.firstObject'));
    }.observes('content.firstObject.isLoaded')
});

只有在firstObject更改时才会触发。

1 个答案:

答案 0 :(得分:0)

事实证明我应该使用findQuery。我之前尝试过这样做:App.Store.findQuery(App.Company)但是没有用。正确的做法是这样的:

this.controllerFor('companies').set('model', this.get('store').findQuery(App.Company));

我需要通过this.get('store')

获取商店