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

时间:2019-06-20 04:34:06

标签: javascript ember.js ember-data

我有一个modelAmodelBmodelCmodelA具有许多modelBmodelB属于modelAmodelB属于modelC

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

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 id等于modelC

的所有baz.id

感谢任何回应。谢谢

1 个答案:

答案 0 :(得分:-1)

Ola @Mikelemuel,谢谢您的提问?

我很难理解您要问的问题difficulty我将首先列出我认为您要问的问题,然后按照我的理解继续回答问题。

首先,您说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'),
})

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

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

  

我要过滤所有模型-a(这是主要查询)   任何同级的孩子的ID都等于this.baz的ID。

以此,我创建了一条简单的路由,该路由仅创建了一些虚拟数据。这对答案并不重要,但对查看我要实现的目标很有用:

// 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')返回某些内容。我想象在您的用例中,您将this.baz设置为动态对象。

接下来您将注意到,我在函数中使用了filter()find()的混合体。值得提醒自己checking out the JavaScript documentationfilter()的工作原理,但实际上,您需要为要包含在结果中的数组中的项目返回一个 truthy 值。

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

我已经在本地进行了测试,并且可以按预期运行(基于我对您问题的理解)。

我希望这会有所帮助?