【问题标题】:How do I use a service property in a route?如何在路由中使用服务属性?
【发布时间】:2017-07-31 22:12:22
【问题描述】:

我有一个服务来处理用户身份验证并通过模型获取用户数据。它获取的数据之一是饮食计划的开始日期。我想用这个日期来计算一个数字:程序启动后的天数,所以我可以用这个数字来查询从 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'
        }
      });
    },

});

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

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

【问题讨论】:

    标签: javascript node.js ember.js ember-data


    【解决方案1】:
    1. activeCleanse它的计算属性依赖于authManager.currentUser,所以你的计算属性格式应该是这样的
    activeCleanse: Ember.computed('authManager.currentUser',function(){ //返回结果 }),

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

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

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

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

    【讨论】:

    • 感谢您的澄清,但您的解决方案似乎不起作用。 setupController() 钩子似乎根本没有任何效果。现在模板甚至无法识别activeCleanse 属性的存在。我也尝试让控制器返回一个承诺,但这也没有得到任何结果。
    • 抱歉,我没有看到您提供的代码。我把它放到控制器中,现在我得到一个错误TypeError: Cannot read property '_attributes' of undefined。不知道那指的是什么,但控制器是所有已经改变的。再次感谢您的帮助。
    • 我在第二点更新了代码。我不知道这个 Promise this.get('authManager.currentUser') 会返回什么。只要确保您收到的user.cleanse_start 是正确的。
    • 我接受你的回答,因为最终问题归结为处理承诺对象,我想为可能看到这一点的人提供更多细节。为了做我想做的事,我们实际上使用了didInsertElement钩子,然后使用this.get('authManager.currentUeser).then ( (user) => {...}这允许我们在promise的解析中进行数据存储调用,以便使用来自用户模型的信息来过滤致电store。有点奇怪,但它奏效了。感谢您的帮助@kumkanillam
    猜你喜欢
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2013-06-11
    • 2023-04-10
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多