Я пытаюсь реализовать панель навигации, которая отображает либо Sign in
, либо Sign out
в зависимости от логического значения в Ember Service, которое я внедрил в маршрут application
(определенный в routes/application.js
).
Я также прочитал это и это подтверждает мой выбор сервисного подхода к обработке состояния.
Теперь вопрос и проблема в том, что дочерние компоненты не обновляются, когда я перенаправляюсь с одного маршрута на другой. Если в ссылке указано Sign in
, после успешной аутентификации и входа ссылка все равно будет содержать Sign in
. Только когда я обновляю страницу, текст ссылки меняется на Sign out
. Поведение ссылки Sign out
такое же.
Код в application.hbs
:
{{nav-bar isAuthenticated=isAuthenticated}} ==> seems like only loaded once
{{outlet}}
Код для ссылок входа и выхода в nav-bar.hbs
:
{{log isAuthenticated }} ==> only prints upon page load, doesn't print on route changes
{{#if isAuthenticated}}
<ul class="nav navbar-nav navbar-right">
{{#link-to 'logout' tagName="li" class="nav-item"}}<a class="nav-link" href="">Logout</a>{{/link-to}}
</ul>
{{else}}
<ul class="nav navbar-nav navbar-right">
{{#link-to 'login' tagName="li" class="nav-item"}}<a class="nav-link" href="">Login</a>{{/link-to}}
</ul>
{{/if}}
Мои действия при входе:
this.transitionTo('dashboard');
Проблема в том, что он переходит без обновления панели навигации. Это почему? Что я могу сделать, чтобы обойти эту проблему?
Обновление в отношении комментариев и первого ответа:
Что делать, если у меня нет контроллера приложений? У меня есть это до сих пор в моем приложении Route, но оно все еще не обновляется, хотя я передаю данные на компонент панели навигации:
simpleAuthManager: Ember.inject.service(),
isAuthenticated: Ember.computed('simpleAuthManager', 'simpleAuthManager.user', function() {
console.log(this.get('simpleAuthManager.user'));
return this.get('simpleAuthManager').isAuthenticated();
}),
setupController(controller, model) {
this._super(controller, model);
controller.set('isAuthenticated', this.get('isAuthenticated'));
}
isAuthenticated
в контроллере приложения, а затем обновлять его с помощьюnotifyPropertyChange
всякий раз, когда вы входите в систему или выходите из нее, чтобы она всегда оставалась синхронизированной. - person alizahid   schedule 10.01.2018setupController
только один раз на маршруте приложения. для этого нужен контроллер. или еще лучше, сделайте это в компоненте панели навигации. но не забудьте обновить свойство, чтобы представление обновлялось. - person alizahid   schedule 11.01.2018