如何在路线中使用服务 属性?
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'
}
});
},
});
我希望能够根据日期的计算动态设置过滤器的标签。
如有任何帮助,我们将不胜感激。我觉得我一直在兜圈子,我不知道该尝试什么。
activeCleanse
它的计算 属性 取决于 authManager.currentUser
,所以你的计算 属性 格式应该是这样的
activeCleanse: Ember.computed('authManager.currentUser',function(){
//return the result
}),
不需要 bind(this)
,因为计算的 属性 将在特定上下文中调用,在您的示例中 this
将是控制器。
- 目前您的计算 属性 正在返回 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);
});
我有一项服务可以处理用户身份验证并通过模型获取用户数据。它获取的数据之一是饮食计划的开始日期。我想使用这个日期来计算一个数字:自程序开始以来的天数,因此我可以使用该数字来查询从 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'
}
});
},
});
我希望能够根据日期的计算动态设置过滤器的标签。
如有任何帮助,我们将不胜感激。我觉得我一直在兜圈子,我不知道该尝试什么。
activeCleanse
它的计算 属性 取决于authManager.currentUser
,所以你的计算 属性 格式应该是这样的
activeCleanse: Ember.computed('authManager.currentUser',function(){ //return the result }),
不需要 bind(this)
,因为计算的 属性 将在特定上下文中调用,在您的示例中 this
将是控制器。
- 目前您的计算 属性 正在返回 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);
});