【问题标题】:How should I filter items of a user?我应该如何过滤用户的项目?
【发布时间】:2015-07-09 02:04:50
【问题描述】:

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

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

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

// 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')
});

【问题讨论】:

    标签: ember.js ember-data json-api


    【解决方案1】:

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

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

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


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

    我会使用计算属性:

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

    或者简写;)

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

    并非每个操作都有 Ember 速记,这就是我首先给出完整示例的原因。

    将计算属性与 Promise 一起使用有时会很棘手,但这个计算属性应该会在您的 items 数组更新时更新。

    【讨论】:

    • 很好的答案,但是这需要 API 在过滤之前先获取所有项目。如果用户有多个项目,这可能会有问题。或者,是否总是希望 API 返回一个限制?
    • 附注。我认为此版本 Ember 1.13.2 中不存在 sortByfilter (emberjs.com/blog/2015/06/18/…)
    • 啊,我误会了。您不想只显示蓝色项目,而只想获取蓝色项目。我会更新我的答案。 (另外,sortByfilter 仍然存在。您链接到的博客文章是不同的功能。我也不知道为什么我写了sortBy 而不是filter。这是一个错字。)
    • 很好奇,在计算块中使用get() 的目的是什么?这是编写计算属性函数的替代语法吗?
    • 这是编写计算属性的新方法,详见here。旧方法实际上已被弃用(如果您使用的是 Ember 1.12+,则应该收到警告。)
    猜你喜欢
    • 2015-09-05
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2011-04-13
    • 1970-01-01
    • 2019-06-07
    相关资源
    最近更新 更多