2013-05-21 25 views
3

我有我認爲是一個非常標準的數組/模板關係設置,但是當我將一個新項目推入數組時,我在arrayWillChange中得到上述Cannot call method 'destroy' of undefined錯誤Ember方法來源:「無法調用方法'銷燬'未定義的arrayWillChange

for (idx = start + removedCount - 1; idx >= start; idx--) { 
    childView = childViews[idx]; 
    if (removingAll) { childView.removedFromDOM = true; } 
    childView.destroy(); <-- childView is undefined 
} 

我從來沒有遇到過這個問題。當我從數組中刪除一個項目時,這不會發生。只有在增加。以下是我嘗試複製問題的JSBin的鏈接。錯誤不會被拋出,但模板不會更新。

http://jsbin.com/asemul/2

回答

6

編輯

你打電話array.push代替array.pushObject - 後者是一個Ember.js方法是有約束力的瞭解,這意味着它會自動爲您更新綁定。句柄模板幫助程序{{#each filters}}是對控制器的過濾器數組的綁定,並且模板需要知道在底層數組更新時進行更新。 push不告訴綁定更新,但pushObject呢。

這裏的工作示例(我所做的就是更改按鍵pushObject):http://jsbin.com/asemul/6/

這是一個非常常見的錯誤 - 通常情況下,我發現,如果我的模板不與基本對象同步的,這是因爲綁定有些問題,所以這就是我開始尋找的地方。

編輯完

  1. 我不認爲你應該設置removedFromDOM直接 - 使用childView.remove()其次destroy()嘗試。
  2. 我不確定背景是什麼,但是你看過ContainerView還是CollectionView?這兩種視圖都支持子視圖數組,並且可以完成您希望以更強大和更少代碼執行的操作。
+0

對不起,我沒有指定我的原始問題中的代碼來自Ember源。我沒有直接調用'removedFromDOM'。拋出的錯誤來自Ember源。由於我所做的事很簡單,我無法弄清楚爲什麼Ember不喜歡它。 我會更新我的問題,使其更清楚。 – camdub

+0

我更新了我的答案 - 您使用'''push'''而不是''pushObject'''。你能看到如果使用pushObject的作品? –

+0

修復它。我不知道這是一個Ember特定的方法。我認爲這是推動JS對象,因爲我推絃樂,我不認爲我需要這些。很高興知道,謝謝。 – camdub

相關問題