2012-11-16 39 views
2

在Ember MVC TodoApp上有一個選項「Clear all Completed」。Ember - 清除ArrayProxy

我一直在試圖做一個簡單的「全部清除」。

我已經嘗試了多種事情,沒有一個按我期望的方式工作(清除數據,本地存儲和刷新UI)。

隨樣品的那些是下面這段代碼:

clearCompleted: function() { 
    this.filterProperty(
      'completed', true 
     ).forEach(this.removeObject, this); 
}, 

我的基本測試,我希望作品是這一個:

clearAll: function() { 
      this.forEach(this.removeObject, this); 
     }, 

但是,它的背後留下一些項目。

如果我單擊在Entries控制器中調用此函數的按鈕幾次,則列表最終爲空。我不知道發生了什麼事情!而且不想做一個「解決方法」。

clearCompleted完美的作品。

+0

不能確定在這一點上,但在我看來'removeObjects'有一個錯誤。我也遇到了你所描述的相同問題。 – MilkyWayJoe

回答

5

答案取決於你真正想知道 - 如果你想清除ArrayProxy,按問題的標題,你只需要調用clear()在ArrayProxy實例如:

var stuff = ['apple', 'orange', 'banana']; 
var ap = Ember.ArrayProxy.create({ content: Ember.A(stuff) }); 
ap.get('length'); // => 3 
ap.clear(); 
ap.get('length'); // => 0 

這樣你不直接觸摸內容屬性,任何觀察者都會收到通知(如果您在控制檯中鍵入Todos.router.entriesController.clear(),您會注意到TodoMVC示例中屏幕會更新)。

如果您具體詢問TodoMVC Ember示例,那麼您將受到快速且骯髒的「Store」實施的束縛......如果您按照上述方法操作,則會在刷新頁面時看到該項目的返回因爲沒有綁定或觀察進入「控制器」和商店之間(有點笨,因爲它是Ember的優勢之一,但meh whatev)

Anywho ...像你這樣的entriesController上的「clearAll」方法尋找可以這樣做:

clearAll: function() { 
    this.clear(); 
    this.store.findAll().forEach(this.removeObject, this); 
    } 
+0

哈,有道理!是的,我主要是嘗試從todo應用程序中學習。就像你說的那樣,這些項目正在刷新,所以我認爲這不是要走的路。感謝您的解釋。 – turtlepick

0

好了,這工作:

clearAll: function() { 
    for (var i = this.content.length - 1; i >= 0; i--) { 
     this.removeObject(this.content[i]); 
    } 
}, 

如果有人可以確認,如果是做正確的方式,這將是偉大的!