如何在路线中使用服务 属性?

How do I use a service property in a route?

我有一项服务可以处理用户身份验证并通过模型获取用户数据。它获取的数据之一是饮食计划的开始日期。我想使用这个日期来计算一个数字:自程序开始以来的天数,因此我可以使用该数字来查询从 CMS 中提取内容的不同模型。

除了模板,我无法在任何地方访问该号码。

这是仪表板的控制器

import Ember from 'ember';

export default Ember.Controller.extend({

  authManager: Ember.inject.service('session'),
    });

这是模板

{{#if authManager.currentUser.activeCleanse}}
  You are on a cleanse that starts 
{{authManager.currentUser.cleanse_start}}
  {{else}}
  You are not on a cleanse.
{{/if}}

以上所有代码都有效,但是当我在控制器中尝试这样的操作时:

  activeCleanse: Ember.computed( function(){
    return this.get('authManager.currentUser').then( (user) => {
    return user.cleanse_active;
    }.bind(this))
  }),

  startDate: Ember.computed( function(){
    return this.get('authManager.currentUser').then( (user) => {
    return user.cleanse_start;
    }.bind(this))
  })

并将模板替换为:

{{#if activeCleanse}}
  You are on a cleanse that starts {{startDate}}
  {{else}}
  You are not on a cleanse.
{{/if}}

它不响应 activeCleanse 为假(模板似乎只是检查它是否存在)并且日期标签只显示 [object Object].

我实际上是在尝试获取控制器中的日期,以便我可以将其作为参数之一传递给仪表板路线,仪表板路线会根据特定日期获取模型:

仪表板路线

import Ember from 'ember';

export default Ember.Route.extend({

  model() {
    return this.get('store').queryRecord('cleanse-post', {
      filter: {
        tag: 'day-1'
        }
      });
    },

});

我希望能够根据日期的计算动态设置过滤器的标签。

如有任何帮助,我们将不胜感激。我觉得我一直在兜圈子,我不知道该尝试什么。

  1. activeCleanse 它的计算 属性 取决于 authManager.currentUser,所以你的计算 属性 格式应该是这样的
     activeCleanse: Ember.computed('authManager.currentUser',function(){
      //return the result
     }),

不需要 bind(this),因为计算的 属性 将在特定上下文中调用,在您的示例中 this 将是控制器。

  1. 目前您的计算 属性 正在返回 Promise,计算 属性 不支持 Promise。您可以尝试返回 DS.PromiseObject 使其正常工作。
    activeCleanse:Ember.computed(function(){
        return DS.PromiseObject.create({
          promise: this.get('authManager.currentUser').then( (user) => {
            return user.cleanse_start;
          })
      })

在你的情况下,我会说你可以在路由上使用 setupController 挂钩,你可以在其中设置 activeCleanse 属性,

this.get('authManager.currentUser').then( (user) => {
  this.set('activeCleanse,user.cleanse_active);
});