2013-04-29 72 views
0

我遇到了Ember-Data事務的問題。Ember-Data事務錯誤

我有像這樣

App.MyModel = DS.Model.extend({ 
    id: DS.attr(), 
    answers: DS.hasMany('App.Answer') // another model 
}); 

然後,DS.Model它被啓動後,像這樣,在路由

model: function(){ 
    var transaction = this.get('store').transaction(); 

    return transaction.createRecord(App.MyModel, { 
     id: '1' 
    }); 
} 

我有一個模型,使我的後端的請求服務器使用事務和提交。

this.get('content.transaction').commit(); 

意圖是答案在服務器端更新併發回給我。 如果內容尚未更新,我稱這種

this.get('content').reload(); 

,請求將再次發送。

這一切工作正常。如果找到id,答案將填充。

我的問題是有時候,根據我從服務器返回的內容,我必須提出另一個服務器請求。初始請求正常工作與

this.get('content.transaction').commit(); 

但是當我嘗試重新加載交易,我得到一個錯誤,如下

Uncaught Error: Attempted to handle event `loadedData` on <App.Answer> while in state rootState.loaded.updated.uncommitted. Called with undefined 

現在,當我刪除重裝,我不再得到的錯誤,另外當我在網絡標籤下查看Chrome的控制檯時,我可以看到我想要的結果正在發回,但它們並未在我的DS模型中更新。答案是未定義的。

任何人都知道爲什麼會發生這種情況?我使用交易錯誤嗎?

編輯

Application.SearchController = Ember.ObjectController.extend({ 
    isComplete: function() { 
     return this.get('content.answers.length') !== 0; 
    }, 


    search: function() { 
     this.get('content.transaction').commit(); 

     var record = this.get('content'); 

     var interval = setInterval(function (controller) { 
      if (controller.get('isComplete')) { 
       controller.transitionToRoute("search.view"); 
       clearInterval(interval); 
      } else { 
       record.reload(); 
      } 
     }, 5000, this); 
    } 
}); 

所以基本上一些在我的路線設置我的模型,並將它們設置爲內容所做的工作,該模型將在服務器端使用,併發送一個id返回搜索結果,然後添加到「答案」。

這項工作很好,直到找到多個結果。然後創建一個新模型,並在不同的控制器上再次調用搜索功能,使用不同的內容。這一次輪到 record.reload();

我得到錯誤 未捕獲的錯誤:嘗試處理狀態爲rootState.loaded.updated.uncommitted的事件loadedData。用undefined調用

所以服務器仍然響應正確的結果,但「答案」不在客戶端更新。

回答

0

您的MyModel記錄是本地修改的(客戶端)。調用reload將嘗試更新它,這在記錄的當前狀態中是禁止的。

您可以用命令檢查:

console.log(this.get('content.stateManager.currentState.path')); 
this.get('content').reload(); 

這應該在您的控制檯,該記錄是uncommitted狀態顯示。

更新:

您不能使用計時器。一切都是異步的,你不能保證你的模型會在這段時間內更新。這意味着,當你提交記錄時,你可能會同時重新加載它(這會產生你看到的錯誤)。

你需要的是這樣的事情:

Application.SearchController = Ember.ObjectController.extend({ 
    search: function() { 
     var record = this.get('content'), 
      controller = this; 

     record.one('didCommit', function() { 
      controller.transitionToRoute("search.view"); 
     }); 

     record.transaction.commit(); 
    } 
}); 
+0

我自己已經得出這個結論。該錯誤消息基本上告訴我。任何解決這個問題的想法,我使用的交易權利? – johnjo 2013-04-30 22:32:49

+0

這裏沒有足夠的代碼能夠指出真正的問題。我不知道你在應用程序中如何修改App.MyModel記錄。在'commit'之後用來調用'reload'的邏輯看起來很危險。 – 2013-05-01 01:19:30

+0

我更新我的問題有更多的解釋 – johnjo 2013-05-01 08:21:16