1

我想我做错了什么,但我不知道是什么。

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

应用

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());
    }
});

公司控制器

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这仅在我的更改时触发。

4

1 回答 1

0

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

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

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

于 2013-03-20T13:57:39.453 回答