2

私は最近 Emberjs を見ていましたが、主な貢献者の 1 人が書いた次の有用な記事を見つけました: Ember.js の使用に関するアドバイスと説明

サーバーからユーザー データのリストを取得し、それらを画面に表示する例を説明しました。それがどのように機能したかを簡単に説明します。

  1. アプリはサーバーに接続して、ajax 呼び出しを介してユーザー データのリストを取得します。
  2. ajax 呼び出しの最後に、空の列挙型がすぐに返され、後でコントローラーのプロパティとして使用されます。
  3. ajax 呼び出しが完了すると、enum にデータが入力され、コントローラーのプロパティが更新され、最後に自動再レンダリングがトリガーされます。

リストが再訪されない限り、これは正常に機能します。ユーザーがリストに再度アクセスすると、たとえば別の状態に移動して戻ってくると、ロジックが再びトリガーされ、サーバーからデータが取得され、リストに入力されます。しかし、今回のリストは空ではありません!したがって、重複データのリストがあります。ajax呼び出し成功時にリストの内容をクリアすることで解決したいと思います。以下は、ajax 呼び出しのコードです。

allAwesomebergs: [],
fetch: function(){
    $.ajax({
        url: 'https://api.github.com/repos/emberjs/ember.js/contributors',
        dataType: 'jsonp',
        context: this,
        success: function(response) {
            response.data.forEach(function(awesomeberg){
                this.allAwesomebergs.addObject(App.Awesomeberg.create(awesomeberg))
            }, this);
        }
    });
    return this.allAwesomebergs;
},

上記のコードは、リストの内容をクリアしません。success 関数の先頭に「allAwesomebergs = []」という行を追加してみましたが、何も表示されないだけでした。これを正しく行っていない可能性があると思いましたが、Ember のドキュメントを見て、Enumerable のコンテンツをクリアすることについて何も見ませんでした。

したがって、問題は次のとおりです。この重複した読み込みの問題を解決する最も簡単な方法は何ですか? 事前にコンテンツをクリアするのが最も明白なようですが、うまくいきません。

4

2 に答える 2

3

clear()新しいオブジェクトの追加を開始する前に呼び出すことができます。このドキュメントを参照してください。

新しいコードは次のようになります。

allAwesomebergs: [],
fetch: function(){
    $.ajax({
        url: 'https://api.github.com/repos/emberjs/ember.js/contributors',
        dataType: 'jsonp',
        context: this,
        success: function(response) {
            this.allAwesomebergs.clear();
            response.data.forEach(function(awesomeberg){
                this.allAwesomebergs.addObject(App.Awesomeberg.create(awesomeberg))
            }, this);
        }
    });
    return this.allAwesomebergs;
},
于 2013-01-04T22:23:54.837 に答える
-2

あなたのアプローチは大丈夫だったと思いますが、そうすべきでした:

this.allAwesomebergs = []

目の前のこれがすべてです。ここでは明確にする必要はありません。

于 2013-01-04T22:50:02.283 に答える