2

Ember MVC TodoAppには、「すべてクリア」オプションがあります。

私は単純な「すべてクリア」をしようとしてきました。

私は複数のことを試しましたが、どれも期待どおりに機能しませんでした(データのクリア、ローカルストレージ、UIの更新)。

サンプルに付属しているのは、以下のコードです。

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

私が機能することを期待していた私の基本的なテストはこれでした:

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

しかし、それはいくつかのアイテムを残しています。

エントリコントローラでこの関数を呼び出すボタンを数回クリックすると、リストが空になります。何が起こっているのか分かりません!そして、「回避策」を実行したくない。

ちなみに、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

このようにして、コンテンツプロパティに直接触れずに、オブザーバーに通知されます(TodoMVCの例ではTodos.router.entriesController.clear()、コンソールに入力すると画面が更新されることがわかります)。

TodoMVC Emberの例について具体的に質問している場合は、迅速で汚い「ストア」の実装に翻弄されています...上記のように行った場合、ページを更新すると、アイテムがないため、アイテムが返されます。エントリ「コントローラー」とストアの間で行われているバインディングまたは監視(これはEmberの強みの1つですが、なんとなく)

誰でも...あなたが探していたような「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 に答える