Ember.js Ember application.hbs模板子组件未重新加载
我正在尝试实现一个导航栏,该导航栏显示Ember.js Ember application.hbs模板子组件未重新加载,ember.js,ember-router,Ember.js,Ember Router,我正在尝试实现一个导航栏,该导航栏显示登录或注销,具体取决于我已注入应用程序路由(在路由/application.js中定义)的余烬服务中的布尔值 我还阅读了这篇文章,它重申了我对处理状态的服务方法的选择 现在的问题是,当我从一个路由重定向到另一个路由时,子组件没有更新。如果链接显示为登录,当我成功进行身份验证并登录时,链接仍会显示为登录。只有当我刷新页面时,链接文本才会变为注销。注销链接行为相同 应用程序.hbs中的代码: {{nav-bar isAuthenticated=isAuthe
登录
或注销
,具体取决于我已注入应用程序
路由(在路由/application.js
中定义)的余烬服务中的布尔值
我还阅读了这篇文章,它重申了我对处理状态的服务方法的选择
现在的问题是,当我从一个路由重定向到另一个路由时,子组件没有更新。如果链接显示为登录
,当我成功进行身份验证并登录时,链接仍会显示为登录
。只有当我刷新页面时,链接文本才会变为注销
。注销
链接行为相同
应用程序.hbs中的代码:
{{nav-bar isAuthenticated=isAuthenticated}} ==> seems like only loaded once
{{outlet}}
{{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}}
导航栏.hbs中登录和注销链接的代码:
{{nav-bar isAuthenticated=isAuthenticated}} ==> seems like only loaded once
{{outlet}}
{{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}}
问题是它在不更新导航栏的情况下进行转换。为什么呢?我能做些什么来解决这个问题
关于评论和第一个答案的更新:
如果我没有应用程序控制器怎么办?到目前为止,我的应用程序路径中已经有了这一点,但它仍然没有更新,即使我正在将数据向下传递到导航栏组件:
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
更改时,都需要计算属性来重新计算状态
据我所知,您的应用程序模板中有一个导航栏子组件,并且有一个管理应用程序当前登录/注销状态的服务。计算属性和服务注入可以在这方面帮助您
设置一个计算属性,用于监视应用程序控制器中服务中的isAuthenticated
变量(如果没有,则创建一个控制器)。将isAuthenticated
作为参数传递给导航条组件。在导航栏中,组件也会注入服务,并让它在每次单击登录/注销链接时在操作中设置已验证状态
这样,每次有人登录或注销您的服务时,您的应用程序控制器中的isAuthenticated
computed属性都会随之更新
您可以阅读余烬的计算属性 您需要在应用程序控制器中创建一个名为“isAuthenticated的计算属性,然后在登录或注销时使用
notifyPropertyChange
对其进行更新,以使其始终保持同步。我认为这样做行不通。因为在应用程序路由上只调用一次setupController
。你需要一个控制器。或者更好,在导航栏组件中执行此操作。但请记住更新属性,以便更新视图。太棒了!成功了:)谢谢