2013-02-18 2 views
1

У меня есть два контроллера, которые загружаются в один и тот же выход, поэтому только один может быть активным за один раз. Оба наблюдения свойства на третий контроллер, как это:Как узнать, какой контроллер загружен в розетку

App.SearchController = Ember.ObjectController.extend({ 
    needs: ['navigation'], 

    updateResults: function() { 
     console.log('load search data'); 
    }.observes('controllers.navigation.search') 
}); 

Полного образец

http://jsfiddle.net/FMk7R/1/

Если свойство изменяет некоторые данные извлекаются. Если я нажимаю на обе ссылки, чтобы оба они были загружены, то при изменении свойства оба контроллера получают событие наблюдения и загружают данные. Я хотел бы загрузить данные только в том, что видно.

Как узнать, какой контроллер в настоящее время активен и загрузить данные только в активном состоянии?

ответ

3

В идеале ваши контроллеры не должны знать, что они активны. Один из вариантов - инвертировать отношения, так что NavController отвечает за изменение свойства запроса «активного» контроллера.

** ОБНОВЛЕНИЕ - Добавление пример, основанный на комментарий **

App.SearchRoute = Ember.Route.extend({ 
    setupController: function(controller) { 
     this.controllerFor('navigation').set('active', controller); 
    } 
}); 

App.ImagesRoute = Ember.Route.extend({ 
    setupController: function(controller) { 
     this.controllerFor('navigation').set('active', controller); 
    } 
}); 

App.SearchController = Ember.ObjectController.extend({ 
    loadResults: function (query) { 
    console.log('loading web search data for: ', query); 
    } 
}); 

App.ImagesController = Ember.ObjectController.extend({ 
    loadResults: function (query) { 
    console.log('loading image search data for: ', query); 
    } 
}); 

App.NavigationController = Ember.ObjectController.extend({ 
    search: '', 
    active: null, 
    searchDidChange: function() { 
    this.get('active').loadResults(this.get('search')); 
    }.observes('search', 'active') 
}); 

См http://jsfiddle.net/F3uFp/1/

Другой альтернативой является использование вычисляемых свойств вместо этого. Ember будет только обновлять вычисленные свойства, которые действительно необходимы для отображения активного представления. Например:

App.SearchController = Ember.ObjectController.extend({ 
     needs: ['navigation'], 
     results: function() { 
      console.log('loading web search data'); 
      return("web search results"); 
     }.property('controllers.navigation.search') 
    }); 

Смотрите обновленный скрипку здесь: http://jsfiddle.net/ZTnmp/

http://jsfiddle.net/FMk7R/1/

+0

Вы упомянули, я мог бы инвертировать отношения, как я могу это сделать? Я имею в виду, как я могу получить активный контроллер в NavigationController? –

+0

'нуждается в [' active '] 'в' NavigationController', а затем у вас есть 'controllers.active'. – Wildhoney

+0

Определите свойство (скажем, 'active') на 'NavigationController', которое установлено из hookController на' SearchRoute' и 'ImagesRoute', например:' this.controllerFor ('navigation'). Set ('active', controller); '- тогда вы можете наблюдать изменения в поле поиска из' NavigationController' и вызывать соответствующие методы на том, какой контроллер активен. –

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