2014-10-29 5 views
0

У меня есть 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 проблемы:

  1. Ember 1.7 показывает предупреждение об устаревании для контроллера. Метод, который, как я понимаю, заменяет новую функцию «потребности», но в этом случае, что является альтернативой !?
  2. Только самый глубокий контроллер может обладать свойством, так или иначе я должен поперек иерархии контроллеров, пока не найду его.

Есть ли лучший способ, без необходимости добавлять код к каждому шаблону/контроллеру или использовать базовые классы для них?

ответ

0

Возможно, вы можете управлять им на уровне маршрута? Поскольку релевантным является активный маршрут, а не контроллер.

I have built an example on jsbin.

Я думаю, что и должны обращаться с имуществом на ApplicationController. Вы можете использовать крюки и didTransition, чтобы установить свойство в зависимости от вашего текущего контроллера. Остальное - это настраиваемый код в зависимости от ваших потребностей.

+0

Ну, это то, что я изначально имел, но это требует от меня поставить логику в контроллерах (didTransition), что является одной из вещей, которые я хочу избежать. Если изменения логики, мне нужно будет исправить каждое использование или этот код. Кроме того, он по-прежнему использует controllerFor, который в вашем примере кода действительно может быть перенесен, чтобы использовать свойство * needs *. –

+0

@AlexandreGomes у вас есть логика в маршрутах, а не в контроллере! И вам нужен 'controllerFor', потому что у вас нет' потребностей' для маршрутов. И если вы хотите создать единую точку для этого кода, используйте mixin! – Lux

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