如何在控制器中迭代Ember.PromiseArray

时间:2014-09-21 16:33:15

标签: ember.js

如何在另一个模型上找到hasMany关系中的记录?我可能过于复杂,但这只是一个简短的例子。

两个型号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'在哪里设置用户'登录后属性为用户模型,因此我可以在播放列表控制器上执行this.get('auth.user')。 auth初始化程序设置为运行after: 'store'并注入每个路由和控制器。

1 个答案:

答案 0 :(得分:0)

由于favoritePlaylist是异步的,因此当async属性更新时,您需要更新计算属性。您可以观看favoritePlaylists更新(添加或删除记录),这将允许它在关系异步更新时更新。

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