2012-11-26 10 views
5

バックボーンのドキュメントは言う:検証が失敗した場合に、検証し、変更のコールバック

Model.setは失敗します - それはすべてのコールバックをトリガされませんので、値を設定しません。私たちは{silent:true}をModel.setに渡すことができます。それは値を設定しますが、コールバックもトリガーしません。

ので、

はなぜバックボーンモデルは、単純に属性値を設定することが有効な状態を必要としていますか?ユーザーがUIとやり取りするときに属性を設定したいが、モデルがまだ有効でない場合はどうすればよいですか? {silent:true}を渡してから手動で変更をトリガーしなければ、変更コールバックが利用できないということです。

あなたがこれを処理するより良い方法を知っていると言ってください:)

答えて

3

私はなぜ質問がありますが、それは良いように設定されている理由の引数があると言うことができお答えするかどうかはわかりません検証を実行します。たとえば、リアルタイムでクライアント側の検証を行うのは簡単ではありません。

ユーザーが現在変更している値の検証のみで問題を解決できる場合は、validateメソッドとhasChangedメソッドを組み合わせて、問題を解決できます。

例えば、このような何か:骨格中

Backbone.Model.extend({ 
    defaults : { name : "" }, 

    validate : function (attrs) { 
    var errors = {}; 
    if(this.hasChanged("name") && attr.name.length == 0) { 
     errors.name = "Need a name yo!"; 
    } 
    //... 

    if(_.keys(errors).length > 0) { 
     return errors; 
    } 
    } 
}) 
+0

Andrew氏に感謝します。しかし、これは問題を解決し、別のものを作成します。変更されていない値の検証はスキップします。 – wcamarao

3

あなたがモデルに設定を呼び出すたび、それはモデルの属性何を追跡が変更され、どのような属性が新たにされてきたadded.Calling検証は、それがより多くのことができます効率的です。set関数のオプションとして{silent:true}をパッシングすると、バリデーションイベントを発生させないようにvalidateとchangeを実行しません。あなたはプレーンなオブジェクトの変化を設定することができます。この場合

If you want to set attributes as the user interacts with the UI, but the model is not valid yet

必ずオブジェクトキーは、モデルの属性としてsamesされ、その後、ちょうどあなたのモデルに設定されたいくつかの点で作ります。

var uiChanges = {name:'x'}; //just fill it with your changes 
ur_model.set(uiModel); //then set it ,this way it fires change events only once 

あなたの平野オブジェクトとモデル間の差分を確認するには、あなたは ur_model.changedAttributes(uiChanges);

changedAttributesを使用することができます - 何も変更された属性が存在しない場合は変更されているすべての属性を含むオブジェクトを返し、または偽 。

モデル全体をもう一度保存するのではなく、変更された属性のみを保存して使用することができます。

関連する問題