我有一个带有关系(很多)的余烬数据模型。所以有一个计算属性取决于关系元素。我需要根据关系属性的数据返回布尔值。
isAllowed: function(){
return this.get('allowedUsers').then(function(data){
var user = this.get('currentUser');
return data.contains(user);
}.bind(this));
}.property()
在上面的代码中,isAllowed
是计算属性,allowedUsers
与user
模型有许多关系,async
设置为true
。 isAllowed被设置为promise对象而不是返回布尔值。我甚至试图创建另一个承诺对象,如下面但没有运气。
isAllowed: function(){
return new Ember.RSVP.promise(function(resolve, reject){
this.get('allowedUsers').then(function(data){
var user = this.get('currentUser');
resolve(data.contains(user));
}.bind(this));
}.bind(this));
}.property()
如何确保将isAllowed设置为布尔值而不是promise对象?
答案 0 :(得分:5)
试试这个:
isAllowed: function(key, value){
if (arguments.length > 1) return value; // the setter was called
this.get('allowedUsers').then(function(data){
var user = this.get('currentUser');
this.set("isAllowed", data.contains(user));
}.bind(this));
return false;
}.property()
答案 1 :(得分:3)
您应该使用DS.PromiseObject
:
isAllowed: Ember.computed('model.users.[]', 'session.currentUser', function() {
return DS.PromiseObject.create({
promise: this.get('session.currentUser').then((user) => {
if (!user) {
return false;
}
return this.get('model.users').isAny('id', user.get('id'));
})
});
})
答案 2 :(得分:1)
如果这是我,我会使用false
初始化,然后将其设置为在setupController
挂钩中解析。例如,在您的控制器中:
isAllowed: false, // Default with access denied
现在您可以利用您的路线了。路线已经在模型和控制器上玩杂耍,所以通常感觉就像是解决侧载承诺的正确位置:
App.FooRoute = Ember.Route.extend({
model: function () {
//...
},
setupController: function (controller, model) {
this.setUserAccess(controller, model);
// more methods if needed...
},
setUserAccess (controller, model) {
controller.get('allowedUsers').then(function(data){
var user = controller.get('currentUser');
controller.set("isAllowed", data.contains(user));
});
}
);
我不确定allowedUsers
来自哪里。你可能需要调整它。
你可以这样做,但是当我用静态属性覆盖计算属性时,我总觉得有点icky。当然,它没有任何问题。