2014-01-30 20 views
1

我們的服務器返回與請求不完全相關的額外的側載記錄,這些記錄應該有效,但會導致商店中的重複記錄和奇怪的UI行爲。 (http://jsfiddle.net/jgillick/agYMQ/Ember Data:Sideloaded記錄會在商店和怪異行爲中創建重複項

爲了簡化它,想象兩個模型:兒童和玩具。孩子有許多玩具。當你給孩子添加一個玩具時,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和全部。

另一個奇怪的效果是當你添加第一個玩具時,在模板中爲它創建列表項,但所有的值都是未定義的。在添加第二個玩具後,UI將按預期更新。嘗試jsfiddle:http://jsfiddle.net/jgillick/agYMQ/

是否真的不可能側載像這樣的額外記錄?有沒有解決方案,還是我只是忽略了一些東西?

回答

0

這是一個有趣的困境,如果相同的記錄在同一個回覆中多次返回,我不確定Ember是否應該知道誰是勝利者記錄(我個人會選擇第二張唱片,但我不知道)。無論這種邊緣情況是不支持的(不是不應該,但可能是較低的優先級)。

關於你看到的另一個問題,我認爲它是通過手動設置內容進入某種代理問題的,我對此沒有積極的態度,但是這裏有更多的Ember方式來設置它。

http://jsfiddle.net/QVqun/

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

});