Ember:Ember数据导致组件

时间:2015-09-04 13:02:32

标签: ember.js ember-data

在我的路线上我通过ember-data请求一些记录。可以说模型类型是' item'。

model: function(){
    return this.get('store').find('item');
}

现在我有了一个名为' my-foo' 的组件,它应该使用这些记录来处理数据。因此,我这样调用组件:

{{my-foo myItems=model}}

在我的路线模板中。在组件js部分中,我试图获取myItems-field并迭代它们。

this.get('myItems').forEach(...);

不幸的是,如果我想要覆盖组件的模型是来自记录或只是单个记录的集合(因为在某些路线上模型是其他result of store.find('item')上的store.find('item', 23424),我不清楚它

如何查看组件中的数据类型。

(我也想知道自从使用ember-data以来它是什么类型的对象。此时它是DS.recordarray还是承诺还是别的什么?)

1 个答案:

答案 0 :(得分:2)

我可以看到问题的两个解决方案:

  1. 让组件了解模型接收的表单
  2. 检查和/或调整组件中的数据类型(在我看来更好的默认方案
  3. 至于了解组件 - 您可以选择2种方法。要么区分你的组件如何获取参数,所以可能有:

    • {{my-foo myItems=model}} - 当您希望收到多件物品时
    • {{my-foo item=model}} - 当您希望收到单一

    然后相应地进行相应的工作,或者 - 第二种方法 - 实际上是拆分组件(同时将共享部件提取到不同的结构),因此您对单个项目my-foomy-foo-array数倍。

    这种方法的优点在于您不会处理 what-if-multiple 逻辑,这可能会在以后变得无法管理,但使用它依赖于项目要求。

    至于检查和/或调整 - 您已经有数据,因此可以假设您的数据很脏并使用computed property清理它。下面的例子中,单个项目被包装成一个数组。

    export default Ember.Component.extend({
      sanitizedItems: Ember.computed('items', function() {
        var items = this.get('items');
        if(!Array.isArray(items)) {
          return [items];
        } else {
          return items;
        }
      })
    });
    

    由于您正在使用Ember.Data,因此根据您的设置,您可能会获得承诺而不是对象/数组。在这种情况下,您可能希望在进行清理之前使用this.get('items').then(function(items) { ... })来解决承诺,但背后的想法完全相同。

    您可以查看完整示例:GistTwiddle