Ember - 清除ArrayProxy

tur*_*ick 2 ember.js

在Ember MVC TodoApp上有一个选项"Clear all Completed".

我一直在尝试做一个简单的"全部清除".

我尝试了很多东西,它们都没有像我预期的那样工作(清除数据,本地存储和刷新UI).

示例附带的代码如下:

clearCompleted: function () {
    this.filterProperty(
            'completed', true
        ).forEach(this.removeObject, this);
},
Run Code Online (Sandbox Code Playgroud)

我期望工作的基本测试是这样的:

  clearAll: function () {
            this.forEach(this.removeObject, this);
        },
Run Code Online (Sandbox Code Playgroud)

但是,它留下了一些物品.

如果我在条目控制器中单击调用此函数的按钮几次,则列表最终为空.我不知道发生了什么事!而且不想做一个"解决方法".

clearCompleted顺便完成.

chr*_*ian 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
Run Code Online (Sandbox Code Playgroud)

这样您就不会直接触摸内容属性,并且会通知任何观察者(如果您Todos.router.entriesController.clear()在控制台中键入内容,您会在TodoMVC示例中注意到屏幕会更新).

如果您特别询问TodoMVC Ember示例,那么您将受到快速而肮脏的"Store"实施的支配...如果您按上述方式执行操作,则会在刷新页面时看到该项目的返回,因为没有绑定或观察在"控制器"和商店之间进行的操作(有点愚蠢,因为它是Ember的优势之一,但是我很高兴)

Anywho ... entriesController你正在寻找的"clearAll"方法可以这样做:

clearAll: function() {
    this.clear();
    this.store.findAll().forEach(this.removeObject, this);
    }
Run Code Online (Sandbox Code Playgroud)