如何过滤hasMany关系?

时间:2014-09-10 23:16:59

标签: ember.js filtering relationship

我有一个用户对象加载到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。我提供了哪些方法来过滤角色?

1 个答案:

答案 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

基本上我说,因为角色是异步属性,所以你永远无法以同步的方式安全地使用它。