2014-09-21 58 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