我们想在我们的ember项目中添加延迟加载功能,但看起来ember将始终覆盖响应JSON没有返回NULL的字段。首先,我得到一个用户列表:
{
"users": [
{
"id": 1,
"name": 'user1',
"email": 'email@user1.com',
"images": [],
"posts": []
},
{
"id": 2,
"name": 'user2',
"email": 'email@user2.com',
"images": [],
"posts": []
},
{
"id": 3,
"name": 'user3',
"email": 'email@user3.com',
"images": [],
"posts": []
},
]
}
这提供了一组最小的用户信息,其中包含两个空的hasMany关系" images"和"帖子"。
现在,如果有人想看到用户的帖子或图片,他会点击一个触发延迟加载的按钮:
获取https://example.com/userImages/1
{
"user": {
"id": 1,
"images": [1,2,3,4]
},
"images": [
{
"id": 1,
"name": "image1",
"path" "path/to/img1/"
},
{
"id": 2,
"name": "image2",
"path" "path/to/img2/"
},
{
"id": 3,
"name": "image3",
"path" "path/to/img3/"
},
{
"id": 4,
"name": "image4",
"path" "path/to/img4/"
}
]
}
要将流量降至最低,仅包含新加载的信息。在适配器反序列化并将新数据推送到存储之后,User1中未包含在有效内容中的所有字段(名称,电子邮件)在ember存储中都设置为NULL(使用 store.pushPayload(&#)测试39;模型',有效负载))。
是否有可能只更新传入数据?或者是否有一个共同的最佳做法来处理这种情况?
提前感谢您的帮助
编辑: 一种可能性是扩展余烬数据" _load()"功能与块
for (var key in record._data) {
var property = record._data[key];
if( typeof(data[key]) == 'object' && data[key] == null ) {
data[key] = property;
}
}
但这是我能想象到的最糟糕的解决方案。
答案 0 :(得分:1)
我认为你想要的是store's update method。它就像push
(或pushPayload
),只是它只更新您提供的数据。
答案 1 :(得分:0)
您的属性返回一个承诺,该承诺将返回从服务器返回的任何内容。
foobar: function() {
return this.store.find('foobar');
}
当promise解析时,您有两个版本的数据,一个已经在客户端(dataOld)中呈现的数据,以及刚刚从后端返回的数据(dataNew)。要更新客户端而不删除没有更改的内容,您必须合并旧的和新的。有点像:
foobar: function() {
var dataOld = this.get('foobar');
return this.store.find('foobar').then(function(dataNew) {
return Ember.$.merge(dataOld, dataNew);
});
}