2012-11-16 34 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]); 
    } 
}, 

如果有人可以确认,如果是做正确的方式,这将是伟大的!