2013-03-20 3 views
1

Я думаю, что я делаю что-то неправильно, но я не знаю, что.isLoaded observer не срабатывает в нужное время

Когда мое приложение загружается, ему необходимо получить все компании, и когда они прибудут, ему необходимо установить свойство 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.

Когда я меняю своего наблюдателя на [email protected], он запускается для всех предметов, находящихся в массиве.

EDIT

Я мог работать вокруг него, как это:

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

Попробуйте изменить App.Company.find() для App.Store.findQuery (App.Company) –

+0

App. У магазина нет метода 'findQuery', когда я пытаюсь это сделать, это ошибка. –

+0

oh Я предположил, что вы вообще не получаете свойство isLoaded, а предыдущий комментарий восходит к старой версии ember, проверьте ответ, который я опубликовал, он может решить проблему. –

ответ

0

Получается, что я должен использовать findQuery. Я пробовал это раньше: App.Store.findQuery(App.Company), но это не сработало. Правильный способ сделать это так:

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

мне нужно получить магазин через this.get('store')

Смежные вопросы