我认为我做错了但我不知道是什么。
当我的应用程序加载时,它需要检索所有公司,当它们到达时,它需要在我的activeCompany
上设置属性ApplicationController
。但是当我在content.isLoaded
上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());
}
});
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
更改时才会触发。
答案 0 :(得分:0)
事实证明我应该使用findQuery
。我之前尝试过这样做:App.Store.findQuery(App.Company)
但是没有用。正确的做法是这样的:
this.controllerFor('companies').set('model', this.get('store').findQuery(App.Company));
我需要通过this.get('store')