我应该如何过滤用户的项目?

How should I filter items of a user?

我正在使用 Ember 1.13.2 和 Ember Data 1.13.4。 API 符合 JSON API 格式 (http://jsonapi.org/format).

一个用户有很多项。在模板中执行 {{model.items}} 将 return ALL 用户的项目。

如果我还需要仅显示来自用户的 blue 项目怎么办。我该怎么办?

// Route
import Ember from 'ember';

export default Ember.Route.extend({
  model(params) {
     // Executes: http://localhost:3099/api/v1/users/5
    return this.store.findRecord('user', params.user_id);
  }
})

// Template
firstName: {{model.firstName}} - works
<br>items: {{model.items}} - works
<br>blue items: {{model.items}} - what do we do about this?

// app/models/user.js
import DS from 'ember-data';
export default DS.Model.extend({
  items:        DS.hasMany('item', { async: true }),
  firstName:    DS.attr('string')
});

// app/models/item.js
import DS from 'ember-data';
export default DS.Model.extend({
  user:           DS.belongsTo('user', { async: true }),
  name:           DS.attr('string')
});

我误解了原来的问题。似乎您只想 获取 颜色为蓝色的项目(并避免获取其余部分)。为此,您需要查询服务器,这需要服务器端代码。但是,一旦你完成了服务器端代码,你就可以做这样的事情:

blueItems: Ember.computed('items.@each.color', {
    get() {
        const query = {
            user: this.get('id'),
            color: 'blue'
        };

        return this.get('store').find('item', query);
    }
})

但同样,您需要服务器支持查询该数据。 (JSON API 说明了您需要如何 return 数据,但您需要自己实施查询。)


旧答案在抓取显示后过滤项目(仅供参考):

我会使用计算 属性:

blueItems: Ember.computed('items.@each.color', {
    get() {
        return this.get('items').filter((item) => {
            return item.get('color') === 'blue';
        });
    }
})

或者 shorthand ;)

blueItems: Ember.computed.filterBy('items', 'color', 'blue')

并非每个操作都有 Ember shorthand 这就是为什么我首先给出完整示例的原因。

使用 promises 的计算属性有时会很棘手,但是这个计算的 属性 应该会在您的 items 数组更新时更新。