[英]Ember.js checkbox and Promise
尝试使用复选框来计算是否存在一对多关系时,我遇到问题。
我有一个userPrivilege表,其中包含userId,modelId,privilegeId和scopeId。
我正在尝试显示复选框,以显示用户是否具有特权。 为此,我需要检查多个条件,而不仅仅是一个简单的布尔字段。
我可以使用异步函数来确定用户是否具有特权,但是我只是不知道如何将其分配给“选定”复选框。 返回承诺意味着始终选中该复选框。 从promise中返回值总是使其不受检查。
下面是我正在尝试的内容的摘要...
复选框组件:
export default Ember.Component.extend({
user: null,
model: null,
privilege: null,
scope: null,
selected: function() {
return this.get('authorization').hasAuthorization(
this.get('user.id'),
this.get('model'),
this.get('privilege'),
this.get('scope')).then(function(result) {
return result;
});
}.property()
})
服务:
export default Ember.Service.extend({
hasAuthorization: function(userId, model, privilege, scope) {
var store = this.get('store');
return new Ember.RSVP.Promise(function (resolve, reject) {
store.find('user', userId).then(function (user) {
user.get('userPrivileges').then(function (userPrivileges) {
userPrivileges.find(function (userPrivilege, index, userPrivileges) {
userPrivilege.get('model').then(function (_model) {
if (_model.get('name') === model) {
userPrivilege.get('privilege').then(function (_privilege) {
if (_privilege.get('name') === privilege) {
userPrivilege.get('scope').then(function (_scope) {
if (_scope.get('name') === scope) {
resolve(true);
}
});
}
});
}
});
});
});
});
});
}
});
编辑:根据评论,我现在尝试链接,但是当不满足if语句时(因为没有返回承诺),现在_privilege和_scope是未定义的。 我认为使用其他结构可以做得更好,我只需要弄清楚如何做。
现在可以正常工作,但是如果权限不存在则不会解析为false:
return new Ember.RSVP.Promise(function (resolve, reject) {
store.find('user', userId).then(function (user) {
if (!user) {
return resolve(false);
}
return user.get('userPrivileges');
}).then(function(userPrivileges) {
if (!userPrivileges) {
return resolve(false);
}
userPrivileges.forEach(function (userPrivilege) {
userPrivilege.get('model').then(function (_model) {
if (_model.get('name') === model) {
return userPrivilege.get('privilege');
}
}).then(function (_privilege) {
if (_privilege.get('name') === privilege) {
return userPrivilege.get('scope');
}
}).then(function (_scope) {
if (_scope.get('name') === scope) {
console.log('true: ' + model + ' ' + privilege + ' ' + scope);
return resolve(true);
}
}).catch(function(error) {
});
});
});
});
您现在只需要在出现错误时就拒绝,并在出现这些错误之一的情况下将您的外在承诺变为假。
import Ember from 'ember';
export default Ember.Service.extend({
hasAuthorization: function (userId, model, privilege, scope) {
var store = this.get('store');
return new Ember.RSVP.Promise(function (resolve, reject) {
store.find('user', userId).then(function (user) {
if (!user) {
return resolve(false);
}
return user.get('userPrivileges');
}).then(function(userPrivileges) {
if (!userPrivileges) {
return resolve(false);
}
return resolve(userPrivileges.find(function (userPrivilege, index, userPrivileges) {
userPrivilege.get('model').then(function (_model) {
if (_model.get('name') === model) {
return userPrivilege.get('privilege');
}
return Ember.RSVP.reject();
}).then(function (_privilege) {
if (_privilege.get('name') === privilege) {
return userPrivilege.get('scope');
}
return Ember.RSVP.reject();
}).then(function (_scope) {
if (_scope.get('name') === scope) {
return Ember.RSVP.resolve(true);
}
return Ember.RSVP.reject();
}).then(null, function(error) {
return Ember.RSVP.resolve(false);
});
}));
});
});
}
});
then
采用第二个参数来处理错误。 https://github.com/tildeio/rsvp.js/#basic-usage
链接时,如果拒绝链的任何先前方法,则调用第二个参数。
在这种情况下,如果发生拒绝,我们希望将原始的承诺解析为false。
更新:解决了查找可能返回未定义的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.