Ember - 清除ArrayProxy

时间:2012-11-16 01:30:24

标签: ember.js

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

我一直试图做一个简单的"全部清除"。

我尝试了多项工作,但没有一项能像我预期的那样工作(清理数据,本地存储和刷新用户界面)。

示例附带的代码如下:

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

我希望工作的基本测试就是这个:

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

尽管如此,它还是留下了一些物品。

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

clearCompleted顺便说一下。

2 个答案:

答案 0 :(得分:5)

答案取决于你真正想知道的内容 - 如果要根据问题标题清除ArrayProxy,只需在ArrayProxy实例上调用clear(),例如:

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的优势之一,但是我很高兴)

Anywho ... entriesController上的“clearAll”方法就像你要找的那样可以这样做:

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

答案 1 :(得分:0)

嗯,这很有效:

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

如果有人能够确认这是否正确,那就太棒了!

相关问题