Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js Ember application.hbs模板子组件未重新加载_Ember.js_Ember Router - Fatal编程技术网

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
。你需要一个控制器。或者更好,在导航栏组件中执行此操作。但请记住更新属性,以便更新视图。太棒了!成功了:)谢谢