2011-07-13 24 views
11

サーバー側のエラー(たとえば、検証エラー)が発生したときにモデルの変更をロールバックするにはどうすればよいですか?Backbone.jsサーバー側の検証と他のサーバー側のエラー

サーバーサイドで特定の検証が行われなければならない場合、backbone.js(Railsバックエンド)でこれを行う適切な方法は何ですか?

バックボーンモデルを保存すると、検証が失敗した場合(そのモデルのビューは更新されません)、適切なユーザーエクスペリエンスを提供するクライアント側の検証が実行されます。ただし、サーバー側の検証が失敗した場合、モデルとそのビューのすべては、サーバーへのPUTの前に(無効なデータで)すでに更新されています。

これにはいくつかの問題があるようです。

  1. モデルがサーバー側で検証される前に、すべてのビューが更新されます。 たとえば、ポップアップ編集 ダイアログを持つモデルのリストがある場合、リスト内のモデルは、Model.saveを呼び出した後で サーバ側の検証が行われる前に、無効な情報 で更新されます。 PUTされました。
  2. サーバがエラー(422エラーなど)を返した場合、モデルの「ロールバック」は発生しません。 unvalidatableデータはちょうどそこに芝生のように座っています。これは本当に悪いものです。

私はbackbone.jsを間違って使用していますか?この(非常に一般的な)シナリオを処理するよく知られた方法はありますか?私は、古い値などのマニュアルキャッシングをいくつか行うことができると理解していますが、それはまあまあの解決策です。

ありがとうございます!

+0

これはここで答えられるようです:http://stackoverflow.com/a/10335668/1284283(1年後、そしておそらくより新しいバージョンのbackbonejs)。 – brightgarden

答えて

5
私は(BackboneJSに新しい)この間違ったをやっている場合

は分からないのですが、私は同じ問題を抱えていたし、ここで私はそれに解決方法は次のとおりです。私はすべての私の検証サーバ側の操作を行い

  • 通常のmodel.saveを実行する代わりに、サーバーに標準のajax呼び出しを行い、変更されたモデルの属性を含むエラーメッセージまたは成功メッセージを返します。成功した場合は、モデルと対応するビューを更新するために返された属性でmodel.setを実行できます。

  • クライアント側の検証を最初に行う場合は、{silent:true}オプションを使用して保存を実行して、ビューが更新されないようにしてから、ajax呼び出しを実行し、 (エラーの場合はモデルの元の値を復元するか、成功した場合はビューを更新してください)

これは役に立ちます。

ps:これは動作しますが、「クリーン」とは感じません。より良い解決策があれば、私も読むことが大好きです

+0

{silent:true}パラメーターについてはわかりませんでした。これは、中間状態の間にビューが更新され続けるのを助けるかもしれません。私は同意する、残りは「きれいな」感じていない:P 申し訳ありませんが、私は '投票アップ'することはできません。私はまだ十分な評判を持っていません。 – John

0

私はサーバー側でエラーをキャッチして、元のレコードの応答クエリをDBから返してからJSONエラーレスポンスとともに表示されます。

model.save({}, { 
    error: function(model, response){ 
    model.set(response); 
    } 
}); 

あなたの見解がモデルの変更イベントを監視していると仮定すると、それらはそれに応じて更新されます。

+0

これは、エラーの特定のサブクラス(私はこのパスを下り始めました)には適していますが、オブジェクトの表現を返す特定のエラーが実行可能でないか、適切ではないかもしれません(例えば、転送レベルのエラーや 'アクセス拒否' 'のようなもの)。 しかし、いくつかのエラーのためにこれを行うことができます。間違いなく通常のサーバー側の検証に役立ちます。 – John

関連する問題