2014-09-21 32 views
0

如何查找另一個模型上的hasMany關係中的記錄?我可能過於複雜的東西,但這是一個簡短的例子。如何迭代控制器中的Ember.PromiseArray

兩個模型,userplaylist - 用戶可以喜歡的播放列表。

我想更改最喜歡的按鈕,以允許用戶'不喜歡'。爲此,我需要檢查當前播放列表模型(我在播放列表路徑中)是否位於user.favoritePlaylist數組中(以更改最喜歡的按鈕)。

這工作,並自動解決了playlist.hbs:

{{#each playlist in user.playlistFavorites}}{{playlist.title}}{{/each}} 

但在我的控制器相同的屬性沒有得到解決,因爲它是一個Ember.PromiseArray,據我可以告訴。如何判斷用戶是否已經收看該播放列表?

的模型是這樣的:

// models/user.js 
export default DS.Model.extend({ 
    name: DS.attr('string'), 
    playlists: DS.hasMany('playlist', {async: true }), 
    favoritePlaylists: DS.hasMany('playlist', { inverse: null, async: true }) 
}); 

// models/playlist.js 

export default DS.Model.extend({ 
    title: DS.attr('string'), 
    tracks: DS.hasMany('track', { async: true }), 
    user: DS.belongsTo('user', { inverse: 'playlists' }) 
});``` 

我在這裏嘗試一些僞代碼,沒有運氣。

isFavorite: function() { 
    var playlist = this.get('model'); 
    var userFavs = this.get('auth.user.favoritePlaylists'); 
    if (userFavs.contains(playlist) { 
     // playlist already a favorite 
    } 
}.property('model', 'auth.user') 

播放列表路由器由Ember生成。我有一個名爲'auth'的初始化程序,我在登錄時將'user'屬性設置爲用戶模型,因此我可以在播放列表控制器上執行this.get('auth.user')。 auth初始化器設置爲運行after: 'store'並注入到每個路由和控制器中。

+0

你介意添加路由/控制器/模板嗎?我正在試圖圍繞這裏的背景環繞我的頭。從這裏的一個模板創建一個示例(http://stackoverflow.com/tags/ember.js/info)將更好 – Kingpin2k 2014-09-21 18:19:19

+0

謝謝,在路由器,控制器上添加了一個註釋,以及我如何通過我的用戶訪問該用戶'auth'初始化程序。 – donleche 2014-09-21 18:37:33

回答

0

由於favoritePlaylist是異步,因此您計算的屬性需要更新爲異步屬性更新。您可以將收看播放列表更新(記錄添加或刪除)視爲異步更新,以便在關係更新異步時進行更新。

isFavorite: function() { 
    var playlist = this.get('model'); 
    var userFavs = this.get('auth.user.favoritePlaylists'); 
    return userFavs.contains(playlist); 
}.property('model', 'auth.user.favoritePlaylists.[]') 
+0

謝謝,現在非常接近。不過,我需要在迭代之前檢查收藏夾是否真實存在。我附上了一個工作示例。我如何將它寫得更短/更好?你可以避免有條件檢查嗎? http://pastie.org/9593837 – donleche 2014-09-25 15:21:27