0

こんにちは、次の点であなたの助けが必要です:

リンクされたリストとして機能するバックボーン コレクションを定義しました。コレクション内の各モデルには、その前身と後継モデルへの参照があります。

新しいモデルをコレクションに挿入すると、先行モデルと後続モデルの両方を更新して新しく挿入されたモデルを参照し、これらのモデルをデータベースに保存するイベントがトリガーされます。

モデルのシーケンスが重要であり、アプリケーションはステートレスのままでなければなりません。

問題: 神経質なユーザーが [追加] ボタンをすばやく押すと、アプリケーションで見つかったよりも多くの Model インスタンスがデータベースに表示されることがわかりました。(これは、データベースへの非同期 AJAX 呼び出しによるものだと思います)

モデルの保存関数を上書きし、1 回の AJAX 呼び出しでモデルの更新を実行し、コールバックを介してモデルの保存呼び出しをキューに入れることを検討しました。

ただし、私は間違ったツリーを吠えていると思います。この問題にはより良い解決策があると期待しています。

あなたの助けに感謝します。

4

1 に答える 1

1

add最も簡単な解決策は、前のリクエストが完了するまでボタンを無効にすることです。#addボタンのあるビューがあると仮定しましょう:

addClicked: function(e) {
  var $add = this.$("#add");
  var model = new Model(this.parseAttributesFromView()); //or something...

  //disable add button
  $add.attr('disabled', true);

  model.save().done(function() {
    //enable add button after save succeeds
    $add.attr('disabled', false);
  });
}

またはdebounce、クリック イベント ハンドラーをnミリ秒ごとに 1 回だけ実行できるようにすることもできます。

//only allow add once every 100ms
addClicked: _.debounce(function() {
  //..
}, 100, true)

いずれにせよ、ビュー レベルで問題を解決できれば、パケットまたはキュー ベースのソリューションを実装するのはやり過ぎのように思えます。

于 2013-01-25T09:15:29.217 に答える