У меня есть Ember.js, где я хочу иметь меню «бар» в шаблоне приложения (или частичный шаблон). Меню является общим, но имеет пару параметров/свойств, которые должны контролироваться маршрутизатором или контроллером, например, некоторые маршруты, такие как логин, не должны показывать кнопку «вернуться».Меню уровня приложения настраивается на уровне маршрутизатора/контроллера
Я также хочу избежать шаблонов на уровне маршрутизатора или контроллера, но я нахожу решение, которое я разработал, чтобы быть менее идеальным. Вот что я сделал:
controllers/application.js:
showBackButton: function() {
var v = this.controllerFor(this.currentRouteName).get('showBackButton');
return (Ember.isEmpty(v) ? true : v);
}.property()
И потому, что шаблоны не обновит между изменениями маршрута:
routes/application.js:
didTransition: function() {
this.controller.propertyDidChange('showBackButton');
return true;
}
Это позволяет мне определить новое значение свойства в контроллере, и она работает. Но у меня есть 2 проблемы:
- Ember 1.7 показывает предупреждение об устаревании для контроллера. Метод, который, как я понимаю, заменяет новую функцию «потребности», но в этом случае, что является альтернативой !?
- Только самый глубокий контроллер может обладать свойством, так или иначе я должен поперек иерархии контроллеров, пока не найду его.
Есть ли лучший способ, без необходимости добавлять код к каждому шаблону/контроллеру или использовать базовые классы для них?
Ну, это то, что я изначально имел, но это требует от меня поставить логику в контроллерах (didTransition), что является одной из вещей, которые я хочу избежать. Если изменения логики, мне нужно будет исправить каждое использование или этот код. Кроме того, он по-прежнему использует controllerFor, который в вашем примере кода действительно может быть перенесен, чтобы использовать свойство * needs *. –
@AlexandreGomes у вас есть логика в маршрутах, а не в контроллере! И вам нужен 'controllerFor', потому что у вас нет' потребностей' для маршрутов. И если вы хотите создать единую точку для этого кода, используйте mixin! – Lux