如何在 ember.js 中实现正确的过滤

How to implement a correct filtering in ember.js

我有一个 modelAmodelBmodelCmodelA hasMany modelB, modelB 属于 modelA, modelB 属于 modelC.

下面是我在 component.js 上计算出的 属性,下面的代码是我想获取所有 modelA,其中 modelC id 等于 baz.id

foo: computed('modelA', 'baz.id', function() {
  return this.get('modelA').filter((a) => {
    return a.get('modelB').filter((b) => {
      let userId = b.get('modelC.id');
      let bazId = this.get('baz.id');

      if (userId === bazId) {
        return b;
      }
    })
  });
}),

问题:我没有得到正确的响应。响应不符合我的期望。 问题:我是否根据我想要的场景正确实现了计算的 属性,我想获得所有 modelA,其中 modelC id 等于 baz.id

感谢任何回复。谢谢

Ola @Mikelemuel,感谢您的提问

我在理解您要问的问题时遇到了一些困难我将首先列出我认为您要问的内容,然后根据我的理解继续回答问题。

首先你说I want to get all the modelA where the modelC id is equal to the baz.id很难理解。首先,我建议您不要调用这些 modelA 等,因为很难弄清楚您在问什么,也很难给出答案。如果你能给我这些模型的正确名称,我会在这个答案中更新它们。

根据我对你们关系的了解,这是我创建的设置:

// app/models/model-a.js
import DS from 'ember-data';

export default DS.Model.extend({
  children: DS.hasMany('modelB'),
})
// app/models/model-b.js
import DS from 'ember-data';

export default DS.Model.extend({
  parent: DS.belongsTo('modelA'),
  sibling: DS.belongsTo('modelC'),
})
// app/models/model-c.js
import DS from 'ember-data';

export default DS.Model.extend({
  sibling: DS.belongsTo('modelB'),
})

我根据您提供的关系描述构建了这些模型。如果它们不正确或者您对每个属性名称有更好的名称,请告诉我。

现在重新表述您要查找的查询:

I want to filter all model-a (which is the main query) where they have any children who's sibling has an ID equal to the id of this.baz

有了这个,我创建了一个简单的路由,它只创建了一些虚拟数据。这对答案并不重要,但它有助于了解我要实现的目标:

// app/routes/application.js
import Route from '@ember/routing/route';

export default Route.extend({
  model() {
    let result = this.store.createRecord('model-a');

    let children = [
      this.store.createRecord('model-b', {
        parent: result
      }),

      this.store.createRecord('model-b', {
        parent: result
      })
    ];

    this.store.createRecord('model-c', {
      id: 'five',
      sibling: children[1]
    });

    return [result];
  }
});

这样我们就可以创建您在控制器中描述的计算 属性:

// app/controllers/application.js
import Controller from '@ember/controller';
import { computed } from '@ember/object';

export default Controller.extend({
  baz: computed(function() {
    return {
      id: 'five',
    }
  }),

  foo: computed('model', 'baz.id', function() {
    let result = this.model.filter((item) => {
      return item.children.find((child) => {
        return child.get('sibling.id') === this.get('baz.id');
      })
    });

    return result;
  }),
});

首先,您会看到我有一个 baz 计算的 属性,我只是用它来制作它,以便 this.get('baz.id') return 有一些东西。我想在您的用例中,您将 this.baz 设置为动态的。

接下来您会注意到,我在我的函数中混合使用了 filter()find()。值得提醒自己 filter() 如何通过 checking out the JavaScript documentation 工作,但本质上你需要 return 一个 truthy 值来包含数组中的项目在结果中。

为了提供这个真值,我们正在使用 JavaScript find 它将找到所提供函数的结果为真值的第一个实例。

我已经在本地测试过了,它按预期工作(基于我对你问题的理解)。

希望对您有所帮助