如何在另一个模型上找到hasMany关系中的记录?我可能过于复杂,但这只是一个简短的例子。
两个型号user
和playlist
- 用户可以收藏播放列表。
我想更改收藏夹按钮以允许用户“不喜欢”。要做到这一点,我需要检查当前播放列表模型(我在播放列表路线上)是否在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'
并注入每个路由和控制器。
答案 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.[]')