我有两个对象User和Post。用户有很多帖子,帖子属于用户。
我如何在用户控制器中使用findBy或其他方法来获取带有posts数组的精选帖子?
以下是我实现UserController的方法;但是,featuresPost计算属性将以未定义的形式返回。这是最好的方法吗?如果是这样,我错过了什么?
App.User = DS.Model.extend({
name: DS.attr('string'),
email: DS.attr('string'),
client: DS.belongsTo('App.Client', { async: true }),
posts: DS.hasMany('App.Post', { async: true })
});
App.Post = DS.Model.extend({
client: DS.belongsTo('App.Client', { async: true }),
user: DS.belongsTo('App.User', { async: true }),
title: DS.attr('string'),
body: DS.attr('string'),
isFeatured: DS.attr('boolean')
});
App.UserController = Ember.ObjectController.extend({
needs: ['post'],
posts: (function() {
return Ember.ArrayProxy.createWithMixins(Ember.SortableMixin, {
content: this.get('content.posts')
});
}).property('content.posts'),
featuredPost: (function() {
return this.get('content.posts').findBy('isFeatured', true)
}).property('content.featuredPost'),
});
答案 0 :(得分:2)
看看这个:http://emberjs.com/api/#method_computed_filterBy
App.UserController = Ember.ObjectController.extend({
featuredPost: Ember.computed.filterBy('posts', 'isFeatured', true)
});
另外,
featuredPost: (function() {
return this.get('content.posts').findBy('isFeatured', true);
}).property('content.featuredPost')//should be observing 'posts'
你基本上是在观察content.featuredPost但是从你提到的那个属性不存在的情况来看,你应该观察的属性是“帖子”。这是我在学习余烬时所犯的错误,所以感觉就像指出一样。使用内容也是可选的,您可以直接观察与控制器关联的模型。
同样来自doc,findBy似乎只返回与传递的值匹配的第一个项目,而不是所有这些项目。所以要获得第一场比赛,它应该是
App.UserController = Ember.ObjectController.extend({
featuredPost: function() {
return this.get('posts').findBy('isFeatured', true);
}.property('posts')//assuming user model hasMany relation to posts
});
此外,我会使用最新版本的ember数据并进行以下更改:
App.User = DS.Model.extend({
name: DS.attr('string'),
email: DS.attr('string'),
client: DS.belongsTo('client', { async: true }),
posts: DS.hasMany('post', { async: true })
});
App.Post = DS.Model.extend({
client: DS.belongsTo('client', { async: true }),
user: DS.belongsTo('user', { async: true }),
title: DS.attr('string'),
body: DS.attr('string'),
isFeatured: DS.attr('boolean')
});
这很好看:https://github.com/emberjs/data/blob/master/TRANSITION.md
这是一个最基本的工作示例:http://jsbin.com/disimilu/5/edit
希望这有帮助。