2014-09-10 195 views
2

我有一個用戶對象被加載到會話session.user。用戶可以分配許多角色。以下是模型上的外觀:如何過濾hasMany關係?

App.User = DS.Model.extend({ 
    roles  : DS.hasMany('role'), 
    ... 
} 

角色作爲嵌入式記錄加載到用戶。我可以驗證它們是否已成功加載到ember-data存儲中,並且用戶和角色之間的關係都很好。

我希望能夠做的是根據角色屬性獲取用戶角色之一。我試過

但我不相信get方法返回像store.find()方法那樣的承諾。我提供了哪些方法來過濾角色?

回答

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')); 
}); 

將屬性返回給承諾只是使其可用於下一個承諾,它不會將其分配給變量(此處爲foo)。

在這裏,這有助於承諾:https://www.youtube.com/watch?v=8WXgm4_V85E

基本上我說,因爲角色是你永遠能夠以同步的方式安全地使用異步特性。

+0

哦!這是你的演講。激進。很好,讓你的用戶名面對。我一定會看這個。事情是,角色不是異步關係。它們被定義爲'DS.hasMany('role')',我正在使用'DS.EmbeddedRecordsMixin'來嵌入嵌入,這很好。當我'this.get('session.user.roles')',我沒有回到承諾,但我認爲是一個角色數組對象。 – ToddSmithSalter 2014-09-11 02:23:59

+0

我可以確認,當我做'this.get('session.user.roles')'我得到一個DS.ManyArray對象作爲回報。我明白DS.ManyArray擴展了DS.RecordsArray,它擴展了Ember.ArrayProxy。我不應該有權訪問過濾器方法嗎?相反,我總是會收到錯誤'Uncaught TypeError:無法讀取未定義的屬性'過濾器'。 – ToddSmithSalter 2014-09-11 05:06:11

+0

感謝您的鏈接。我確實設法用4層承諾來獲得和過濾角色。我現在遇到的問題是從方法返回承諾的布爾值。我試着把它設置在一個scoped變量上,但似乎並不堅持。 – ToddSmithSalter 2014-09-11 18:10:25