Ember数据 - 如何使用关联的hasMany进行查找

时间:2014-04-26 18:11:48

标签: ember.js ember-data

我有两个对象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'),
});

1 个答案:

答案 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

希望这有帮助。