2

組織を説明するモデルと、組織の権限を説明するサブコレクションがあります。

私の見解では、レンダリングする前に両方のモデルからデータをフェッチする必要があります。ビューレンダリングメソッドを1つのイベント(たとえば、model.changeまたはsubcollection.sync)にバインドすると、モデルにデータが入力される前に画面が表示され、エラーが発生することがあります。

これが私のコードの関連部分です:

  this.model = new OrgModel({id: id});
  this.model.permissions = new PermissionsCollection({org: id});

  this.model.permissions.on("sync", this.render);  // SOMETIMES GETS CALLED BEFORE model:sync GETS CALLED

  this.model.permissions.fetch({error: Utils.apiError});
  this.model.fetch({error: Utils.apiError});

どのイベントを「レンダリング」と呼ぶかはわかりません。各リクエストが最初に返される場合があるためです。

model.fetchが呼び出されたときに、次にsubcollection.fetchを呼び出し、subcollection:syncが呼び出されるまで「sync」イベントを返さないように、「sync」イベントをバインドする方法はありますか?

4

3 に答える 3

3
var deferred1, deferred2, that = this;
this.model = new OrgModel({id: id});
this.model.permissions = new PermissionsCollection({org: id});
deferred1 = this.model.permissions.fetch({error: Utils.apiError});
deferred2 = this.model.fetch({error: Utils.apiError});

$.when(deferred1, deferred2).then(function(){
    that.render();
});

deferred と promise には非常に強力な概念があります。このトピックの詳細については、api.jquery.com/jQuery.Deferredを参照してください。

于 2013-02-22T21:18:44.637 に答える
0

それはおそらく最善の方法ではありませんが、通常は次のように処理します。

  • コレクションのモデルを取得した後に成功関数を追加します。各関数は次のような変数を初期化しますthis.permissionsFetched = true;
  • this.permissionsFetchedrender() を変更して、変数と変数が初期化されている場合にビューまたはその一部がレンダリングされるようにしますthis.modelFetched

このように、最初のレンダリングでエラーが発生することはなく、ビューは実行順序に関係なく、2 回目のフェッチ結果の後にレンダリングされるはずです...

100% きれいに感じられるわけではなく、これを行うためのより良い方法があるかもしれません。ただし、私にとっては問題なく機能しており、フェッチをシリアルにするよりも少し優れています。

于 2013-02-22T15:23:54.137 に答える
0

これを処理する方法は、カウンターを使用して、現在保留中のリクエストの数を追跡することです。

  • カウンターrequestでインクリメントされます
  • オンsyncまたはerrorカウンターが減る
  • カウンターが から0になっ1たら、loadingイベントを発生させます
  • カウンターが から1になっ0たら、loadedイベントを発生させます

renderこのようなシステムを実装して、関数をloadedイベントにバインドできます。

于 2013-02-22T15:39:09.133 に答える