【发布时间】:2018-06-19 06:55:33
【问题描述】:
我正在尝试实现一个导航栏,该导航栏显示Sign in 或Sign out,具体取决于我已注入application 路由(在routes/application.js 中定义)的Ember 服务中的布尔值。
我还阅读了this,它重申了我对处理状态的服务方法的选择。
现在的问题是,当我从一条路由重定向到另一条路由时,子组件没有更新。如果链接显示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');
问题是它在不更新导航栏的情况下进行转换。这是为什么?我能做些什么来解决这个问题?
关于 cmets 和第一个答案的更新:
如果我没有应用程序控制器怎么办?到目前为止,我的应用程序 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对其进行更新,使其始终保持同步。 -
我认为这行不通。因为您只在应用程序路由上调用
setupController一次。你需要一个控制器。或者更好的是,在导航栏组件中执行此操作。但请记住更新属性,以便更新视图。 -
太棒了!它工作:) 谢谢
标签: ember.js ember-router