读取由 ember.js 中带有车把的服务注入的计算 属性

Reading a computed property injected by a service with handlebars in ember.js

我正在尝试使用通过自定义身份验证服务注入的计算 isAuthenticated 属性 来改变我的车把脚本。在 my-application 组件中,通过以下代码可以正常工作:

      {{#if isAuthenticated}}
        <li>{{#link-to "accounts.my-account"}}My Account{{/link-to}}</li>
        <li>{{#link-to "accounts.search-accounts"}}Find other Medici Users{{/link-to}}</li>
      {{/if}}

import Ember from 'ember';

export default Ember.Component.extend({
  auth: Ember.inject.service(),
  user: Ember.computed.alias('auth.credentials.email'),
  isAuthenticated: Ember.computed.alias('auth.isAuthenticated'),

  actions: {
    signOut () {
      this.sendAction('signOut');
    },
  },
});

当我尝试在不同位置(在本例中为帐户路由)实现完全相同的代码时:

<button type="btn" {{action "test"}}>test</button>

{{#if isAuthenticated}}
<p>test</p>
{{/if}}

{{outlet}}

import Ember from 'ember';

export default Ember.Route.extend({
  auth: Ember.inject.service(),
  user: Ember.computed.alias('auth.credentials.email'),
  isAuthenticated: Ember.computed.alias('auth.isAuthenticated'),

  actions: {
    test () {
      console.log(this.get('user'));
      console.log(this.get('isAuthenticated'));
    }
  }
});

模板没有变化(尽管当您用 unless 切换 if 时会出现测试)。让这一切变得陌生的是,当我单击 test 按钮时,它成功触发了 isAuthenticated 的结果。为什么我无法将此 属性 从我的 js 文件传输到我的 hbs 文件?

您需要在控制器中定义属性;帐户路线是否有控制器?路线上的道具(model 除外)对模板不直接可见。

另一种方法是创建一个包装帐户模板的组件;如果您不想要或希望保持较小的规模,则可以在其中注入身份验证服务而不是控制器。

请注意,我们团队所做的一件事是自动将身份验证服务(或者更确切地说,等效的会话服务)注入所有组件;你可以用初始化器来做到这一点。这在一定程度上减少了样板文件。