【问题标题】:Ember - Clearing an ArrayProxyEmber - 清除 ArrayProxy
【发布时间】:2012-11-16 01:30:24
【问题描述】:

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

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

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

示例中的代码如下:

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

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

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

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

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

顺便说一句,clearCompleted 可以完美运行。

【问题讨论】:

  • 目前无法真正确认,但在我看来 removeObjects 有一个错误。我也遇到了你描述的同样的问题。

标签: ember.js


【解决方案1】:

答案取决于您真正想知道的内容——如果您想清除 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

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

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

Anywho...entriesController 上的“clearAll”方法就像您正在寻找的那样:

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

【讨论】:

  • 哈,有道理!是的,我主要是想从 todo 应用程序中学习。就像你说的那样,这些项目正在刷新,所以我认为这不是要走的路。感谢您的解释。
【解决方案2】:

嗯,这行得通:

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

如果有人能确认这是否是正确的做法,那就太好了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-25
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2012-05-31
    相关资源
    最近更新 更多