我有一个用户对象加载到session.user
的会话中。可以为用户分配许多角色。这是模特的样子:
App.User = DS.Model.extend({
roles : DS.hasMany('role'),
...
}
角色将作为嵌入式记录加载到用户。我可以验证它们是否已成功加载到ember-data存储中,并且用户和角色之间的关系都很好。
我希望能够做到的是根据角色属性获得用户角色之一。我试过了
this.get('session.user.roles').then(function (roles) {
return roles.filterBy('propertyName', 'propertyValue');
});
但我不相信get方法会像store.find()方法那样返回一个promise。我提供了哪些方法来过滤角色?
答案 0 :(得分:3)
你做这件事的方式可以通过承诺来实现。让我看看我能否打破它。
以下是展示过滤角色可用位置的漫长道路:
var rolesPromise = this.get('session.user.roles');
var filteredRolesPromise = rolesPromise.then(function (roles) {
return roles.filterBy('propertyName', 'propertyValue');
});
filteredRolesPromise.then(function(filteredRoles){
// available here
console.log(filteredRoles.get('length'));
});
以下是显示过滤角色可用位置的简短方法:
this.get('session.user.roles').then(function (roles) {
var filteredRoles = roles.filterBy('propertyName', 'propertyValue');
// available here
console.log(filteredRoles.get('length'));
});
或
var foo = this.get('session.user.roles').then(function (roles) {
return roles.filterBy('propertyName', 'propertyValue');
}).then(function(filteredRoles){
// available here
console.log(filteredRoles.get('length'));
});
将属性返回到promise只会使其可用于下一个承诺,它不会将其分配给变量(此处为foo
)。
这有助于承诺:https://www.youtube.com/watch?v=8WXgm4_V85E
基本上我说,因为角色是异步属性,所以你永远无法以同步的方式安全地使用它。