2

在 Ember MVC TodoApp 上有一个选项“清除所有已完成”。

我一直在尝试做一个简单的“全部清除”。

我尝试了多种方法,但都没有按预期工作(清除数据、本地存储和刷新 UI)。

示例附带的代码如下:

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

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

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

不过,它留下了一些物品。

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

顺便说一句,clearCompleted 可以完美地工作。

4

2 回答 2

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

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

如果您特别询问 TodoMVC Ember 示例,那么您将受到快速而肮脏的“存储”实现的摆布……如果您按照上述方式进行操作,您将在刷新页面时看到该项目的返回,因为没有在条目“控制器”和 Store 之间进行绑定或观察(有点愚蠢,因为它是 Ember 的优势之一,但 meh whatev)

Anywho ...您正在寻找的类似“clearAll”方法entriesController可以这样完成:

clearAll: function() {
    this.clear();
    this.store.findAll().forEach(this.removeObject, this);
    }
于 2012-11-17T04:32:24.027 回答
0

好吧,这行得通:

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

如果有人可以确认这是否是正确的方法,那就太好了!

于 2012-11-16T01:55:38.450 回答