【问题标题】:Searching Ember data async hasMany ids without loading all the id records搜索 Ember 数据异步 hasMany id 而不加载所有 id 记录
【发布时间】:2014-10-22 22:04:03
【问题描述】:

我正在尝试在数千条记录中搜索特定记录。我已经加载了一个用户模型,它有几千个异步发货。换句话说,我让序列化程序使用用户模型向下发送shipment_ids

App.User = DS.Model.extend({
  shipments: DS.hasMany('shipment', { async: true })
});

我想搜索所有这些 id 以查看特定记录的 id 是否在其中。但是我不想去 api 并加载每一条记录。我只是希望能够搜索到shipment_ids

I have a jsbin 展示了它正在加载所有记录。如何更改此设置,使其不会发出任何 api 调用来发送货件并仍能找到特定记录?

而不是做

this.get('shipments').any(function(shipment){
  return shipment.get('id') === "10124";

必须有一种方法可以只通过 id,不是吗?

谢谢!

【问题讨论】:

    标签: javascript ruby-on-rails ember.js ember-data


    【解决方案1】:

    Get belongsTo ID without fetching record”中描述的解决方案 似乎从 Ember Data 1.0.0-beta.10 开始工作。简而言之,您可以执行以下操作来访问底层

    modelInstance.get('data.belongsToRelation.id');
    

    想必你也可以这样做(虽然我没有测试过):

    modelInstance.get('data.hasManyRelation');
    

    原始答案(请勿使用):

    我通过为 id 添加第二个模型字段来在 belongsTo 上完成此操作。我的例子:

    App.User = DS.Model.extend({ group: DS.belongsTo('group', { async: true }), groupId: DS.attr('number') });

    所以也许你可以这样做?

    App.User = DS.Model.extend({ 发货:DS.hasMany('shipment', { async: true }), shipIds: DS.attr('array') });

    您需要在 app/transforms/array.js 中添加一个数组转换(假设您使用 ember-cli)

    从“ember-data”导入 DS;

    var ArrayTransform = DS.Transform.extend({ 反序列化:函数(序列化){ 返回序列化; }, 序列化:函数(反序列化){ 返回反序列化; } });

    导出默认的ArrayTransform;

    让我知道它是否有效,因为我可能很快需要在我的应用中使用类似的东西。

    【讨论】:

    • 这确实有效。我从没想过要像这样从 json 中捕获 id。 http://jsbin.com/wofig/3/ 你也可以省略数组变换,Ember 会猜测它是一个数组。 http://jsbin.com/wofig/4/ 谢谢!
    • 嗨,我刚刚意识到我的方法会导致 belongsTo 出现一些严重的错误。基本上,一旦您添加了 groupId: DS.attr('number') 属性,它就会弄乱规范化过程并破坏属于关系的异步查找。我会看看我是否能想到一个解决方法,但同时被警告。
    • 所以你的更新基本上是在做我原来的回答。 :]
    • mmmm @bfcoder 有区别 - 您的答案使用 _data 而不是 data
    • @leejt489 虽然你是对的,但它仍然是相同的数据。它只是以不同的方式访问。
    【解决方案2】:

    这个hack很臭,但这是我找到的唯一方法。也就是用_data搜索

    this.get('content._data.shipments').any(function(shipment){
      return shipment.get('id') === "10124";
    });
    

    它不会进行任何 api 调用。但必须有一种更容易接受的方法,在更新 Ember 时不易损坏。

    Here is an updated jsbin 显示这个。谁有更好的解决方案?

    谢谢!

    【讨论】:

      【解决方案3】:

      从 Ember Data 2.3 开始,您可以使用以下代码:

      // get all ids without triggering a request
      var commentIds = post.hasMany('comments').ids();
      

      详情请见http://emberjs.com/blog/2016/01/12/ember-data-2-3-released.html

      【讨论】:

      • 不,你不能,你可以从 Ember Data 2.5.x+ 开始这样做
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 2019-03-08
      • 2017-05-25
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      相关资源
      最近更新 更多