我正在尝试搜索特定记录的数千条记录。我已经加载了一个用户模型,它有几千个异步发货。换句话说,我让序列化程序向下发送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,不是吗?
谢谢!
答案 0 :(得分:2)
这个黑客非常臭,但这是我找到的唯一方法。它是使用_data
this.get('content._data.shipments').any(function(shipment){
return shipment.get('id') === "10124";
});
它不会进行任何api通话。但是,在更新Ember时,必须有一种更容易接受的方法,不容易破损。
Here is an updated jsbin来表明这一点。有没有人有更好的解决方案?
谢谢!
答案 1 :(得分:2)
“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('shipping',{async:true}), shipmentIds:DS.attr('array') });
你需要在app / transforms / array.js中添加一个数组变换(假设你使用了ember-cli)
从'ember-data'导入DS;
var ArrayTransform = DS.Transform.extend({ 反序列化:function(序列化){ 返回序列化; }, serialize:function(反序列化){ 返回反序列化; } });
导出默认的ArrayTransform;
让我知道它是否有效,因为我可能很快会在我的应用中需要类似的东西。
答案 2 :(得分:2)
自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。