2011-08-12 8 views
8

警告:私は完全に制御できないバックエンドを使用しているので、Backbone内のいくつかの考慮事項に取り組んでいます残念ながら、私はここでそれらを扱う以外に選択肢がありません!Backbone.jsモデルの検証はset-> save(フェッチではない)

私の問題は、(Backboneモデルで値を設定すると)フォームからのユーザー入力を本当に確認したいのですが、新しく作成されたオブジェクトのAPIから受け取ったモデルは名前を受け入れるだけで、名前とオブジェクトIDのみを返す)は、妥当性チェックを失敗します。

例として、新しいオブジェクトがデータベースに作成されると、2つのキーフィールドが空の文字列として読み込まれます(したがって、BackboneがAPIにヒットしてモデルを読み込むと、それらのキーに空の文字列が読み込まれます)。ユーザーがこれらのオブジェクトを保存して後で編集するとき、これらの2つのキーの値を入力するようにしたいと思います。これは、Backboneに組み込まれている検証方法では非常に簡単です。

もちろん、fetch-> set(不要な動作)とset-> save(望ましい動作)の両方で検証が行われているため、新しく作成されたモデルはまったく読み込まれません。 .Backboneがそれらを収集し、検証に失敗し、エラーが発生します。

私の質問は、 "バックボーンy"の方法は、セット - >保存ではなく、フェッチ - >セットでモデルを検証することですか?これを回避するために特定のトリガーを使用できますか?

アイデアをいただければ幸いです。あなたは{ silent: true }に渡す場合

答えて

7

Backbone.Model.setは、検証を実行しないであろう、そしてあなたはfetchを上書きするか、オプションのオブジェクトであることを渡し、独自のfetchSilentメソッドを書くことができいずれかのようfetchは、設定して任意のオプションを渡します。

Backbone.Collection.fetchでわずかな問題が発生する可能性があります。サーバーから属性を受け取ると、setという新しいモデルが作成されないためです。代わりにmodel = new this.model(attrs, {collection: this});で新しいモデルを作成し、オブジェクトにvalidateメソッドがある場合は検証を実行します。

これは少し面倒です。 Backbone.Collection.addが完全に形成されたバックボーンモデルを受け取ると、検証を実行しないので、モデルをサイレントに作成する({silent: true}を使用して)コレクションにparseメソッドを定義することで回避できます。 (annotated source_addおよび_prepareModelの方法を参照)。

コレクションがそのように動作するのはちょっと面倒ですが、(少なくとも今のところは)それがそのとおりです。

+0

本当に厄介なことですが、ヒントをいただきありがとうございます。 – ltd

+0

私が見る限り、最新のソースコードのバックボーンでは、サイレントが渡されても設定が有効になるので、役立たない –

4

の代わりにあなたが他の事を行うことができますフェッチオーバーライド:

あなたは、あなたのモデルを検証するmodel.silentをチェックし、それだけでは存在しないかどうかを検証。

ですから、あなたがモデル取得したい場合は、以下のん:

var test = new MyModel({ id: '123', silent: true }); 

// in your Model validate function 
validate: function(attrs) { 
    if (!attrs.silent) { 
    // validate logic here 
    } 
} 

を次にあなたがモデルを取得することができます。モデルを取得した後は、今後の検証のために無音設定を解除することができます。

関連する問題