Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 余烬数据:侧面加载的记录会在存储中创建重复项和奇怪的行为_Javascript_Ember.js_Ember Data - Fatal编程技术网

Javascript 余烬数据:侧面加载的记录会在存储中创建重复项和奇怪的行为

Javascript 余烬数据:侧面加载的记录会在存储中创建重复项和奇怪的行为,javascript,ember.js,ember-data,Javascript,Ember.js,Ember Data,我们的服务器返回额外的边载记录,这些记录与请求不完全相关,这应该可以工作,但它会导致存储中出现重复记录和奇怪的UI行为。() 为了简化它,想象两种模型:儿童和玩具。这孩子有许多玩具。当您向子对象添加玩具时,XHR不仅会响应新的玩具记录,还会侧载子对象和玩具列表。这样,一个请求就可以更新更多的UI。JSON最终看起来像这样: { "toy": { "id": 1, "name": "doll", "quantity": 1 },

我们的服务器返回额外的边载记录,这些记录与请求不完全相关,这应该可以工作,但它会导致存储中出现重复记录和奇怪的UI行为。()

为了简化它,想象两种模型:儿童和玩具。这孩子有许多玩具。当您向子对象添加玩具时,XHR不仅会响应新的玩具记录,还会侧载子对象和玩具列表。这样,一个请求就可以更新更多的UI。JSON最终看起来像这样:

{
    "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')

});