6

次のことを行うよりセクシーな方法はありますか?

scheduleSubjects.fetch({
    success: function(){
        subjectList.fetch({
            success: function(){
                assignments.fetch({
                    success: function(){
                        _this.render();
                    }
                });
            }
        });
    }
});

操作を開始する前に、すべてのデータを取得したいと考えています。

ありがとう。

4

4 に答える 4

8

JQuery の deferred objectsを使用$.whenすると、複数の非同期呼び出しが完了したときにコールバックをトリガーするために使用できます。

$.when(scheduleSubjects.fetch(), subjectList.fetch(), assignments.fetch()).then(_this.render);

が遅延オブジェクトを返すためJQuery.ajax、これが機能することに注意してください。Backbone.fetch


に代わるもの.then.done、元のコールバックのパラメーターを渡すです (OP では必要ありませんが、場合によっては必要になる場合があります)。

$.when(scheduleSubjects.fetch(), subjectList.fetch(), assignments.fetch())
    .done(function(scheduleSubjects, subjectList, assignments) {
        _this.render();
    })
);
于 2013-10-21T23:11:39.260 に答える
7
var collections = [scheduleSubjects, subjectList, assignments];
var complete = _.invoke(collections, 'fetch');

$.when(null, complete).then(function(){
    _this.render();
});

Promises と Underscore を使用して_.invoke()ください。

于 2013-10-21T23:14:24.490 に答える
2

promise を使用することもできます。

scheduleSubjects.done(function () {
  subjectList.fetch();
});
subjectList.done(function () {
  assignments.fetch();
});
assignments.done(function () {
  _this.render();
});
scheduleSubjects.fetch();

またはイベントリスナー:

subjectList.listenToOnce(scheduleSubjects, 'sync', subjectList.fetch);
assignments.listenToOnce(subjectList, 'sync', assignments.fetch);
this.listenToOnce(assignments, 'sync', this.render);
scheduleSubjects.fetch();

ビュー内でこれらのリスナーを定義する必要はありません。それらはアプリケーション レベルに存在する可能性があります。ビューが気にする唯一のことは、assignmentsフェッチされたらレンダリングすることです

于 2013-10-21T23:01:20.543 に答える
0

これを行うために私が考えることができる唯一の他の方法は、バックボーンのbind()and を使用することtrigger()です。

イベントを使用すると、この機能を実現できます。より良い方法があるかどうかはわかりません。最初のコレクションをロードしたら、2 番目のコレクションのロードをトリガーできます。理論的には、例ごとに 2 つのコレクションを結合するべきではありません。subjectListイベント ベースの読み込みは、 とを切り離しscheduleSubjectsます。

于 2013-10-21T19:23:15.970 に答える