Javascript 余烬数据:侧面加载的记录会在存储中创建重复项和奇怪的行为
我们的服务器返回额外的边载记录,这些记录与请求不完全相关,这应该可以工作,但它会导致存储中出现重复记录和奇怪的UI行为。() 为了简化它,想象两种模型:儿童和玩具。这孩子有许多玩具。当您向子对象添加玩具时,XHR不仅会响应新的玩具记录,还会侧载子对象和玩具列表。这样,一个请求就可以更新更多的UI。JSON最终看起来像这样:Javascript 余烬数据:侧面加载的记录会在存储中创建重复项和奇怪的行为,javascript,ember.js,ember-data,Javascript,Ember.js,Ember Data,我们的服务器返回额外的边载记录,这些记录与请求不完全相关,这应该可以工作,但它会导致存储中出现重复记录和奇怪的UI行为。() 为了简化它,想象两种模型:儿童和玩具。这孩子有许多玩具。当您向子对象添加玩具时,XHR不仅会响应新的玩具记录,还会侧载子对象和玩具列表。这样,一个请求就可以更新更多的UI。JSON最终看起来像这样: { "toy": { "id": 1, "name": "doll", "quantity": 1 },
{
"toy": {
"id": 1,
"name": "doll",
"quantity": 1
},
"children": [
{
"id": 0,
"name": "Ben",
"quantity": 1,
"toys": [0, 1]
}
],
"toys": [
{
"id": 0,
"name": "car",
"quantity": 1
},
{
"id": 1,
"name": "doll",
"quantity": 1
}
]
}
出于某种原因,这导致余烬商店的记录数组中有3个玩具。这不应该发生,因为这些项目具有ID。因此,加载具有重复ID的记录会导致它覆盖上一条记录。相反,当我查看商店的记录数组时,记录是重复的——id和all
另一个奇怪的效果是,当您添加第一个玩具时,会在模板中为其创建列表项,但所有值都未定义。添加第二个玩具后,UI将按预期更新。尝试JSFIDLE:
真的不可能像这样侧向加载额外的记录吗?有解决办法吗?还是我忽略了什么?这是一个有趣的难题,如果同一条记录在同一个响应中多次返回,我不确定Ember是否应该知道谁是赢家记录(我个人会选择第二条记录,但我不知道)。无论如何,不支持此边缘情况(并非不应该支持,但可能优先级较低) 关于你看到的另一个问题,我认为手动设置内容会遇到某种代理问题,我对此不是很肯定,但这里有一个更容易设置的方法
App.IndexRoute = Em.Route.extend({
model: function(){
return this.store.createRecord("child", {
'name': childName
});
}
});
//
// Main Program
//
App.IndexController = Em.ObjectController.extend({
actions: {
// Add a toy to the child
addToy: function(){
var self = this,
store = this.get('store'),
toys = this.get('model.toys'),
toy = nextToy();
// Create toy and add it to the child
toy = store.createRecord('toy', {
'name': toy.name,
'quantity': toy.quantity
});
toys.pushObject(toy);
// Save the new toy
toy.save();
}
},
storeToys: function(){
return this.store.all('toy');
}.property(),
storeToysLen: Em.computed.alias('storeToys.length')
});