2012-01-05 7 views
2

model.set({field: 'value'})を実行すると、明示的に指定されたフィールドが唯一であるかのようにそのモデルの検証が実行されますモデルのパラメータセット。バックボーン:set()パラメータでのみ実行される検証

「first_field」と「second_field」フィールドの存在を必要とする検証がある場合、model.set({third_field: 'value'})を実行すると、first_fieldとsecond_fieldすでに設定されています。コンソールからは、検証が実行される前と後の両方でfirst_fieldとsecond_fieldが使用できますが、console.logには、validate関数内の第3フィールドのみが入力された(attrs)フィールドがあります。

私が公式文書で読んだことから、検証方法のパターンは問題ありませんが、何かが間違っています。以下の任意のアイデア感謝、コード:

class MyModel extends Backbone.Model 
    # ... 
    validate: (attrs) -> 
    errors = [] 
    valid = true 
    console.log attrs 
    if (!attrs.first_field) 
     errors.push('You must add a first field') 
    if (errors.length > 0) 
     return errors 
    # ... 

とコンソールから、私は

m = window.router.my_models.test_model # Contains attributes 'first_field' and 'second_field' 
m.set({new_field: 'test value'}) 

を実行する場合には、検証から来ている、「偽」を返します。 validateメソッド内部ATTRS上にconsole.log backbone docsからのみATTRS値の存在が明示的に設定された「new_field」

+0

と交換しますか?私のデバッグに基づいて、Backbone.Mvalid._validate()のこの行のためにモデル全体の属性がvalidate()に送られているようです: "attrs = _.extend({}、this.attributes、attrs);" – SAGExSDX

+0

はい - これが書かれて以来、バックボーンは大きく変化しました。 – PlankTon

答えて

4

で確認:

[検証方法]についての属性を渡されます

を更新するので、attrsオブジェクトが正しくのみnew_fieldが含まれています。あなたは、モデルの他のフィールドにアクセスする場合、あなたはおそらくthis.get("first_field");

2

あなたの例ではそれは簡単に更新する修正だnew_field

あるvalidateメソッドに渡され、変更された属性だけを行うことができ、あなたのメソッドを検証してfirst_fieldが存在するかどうかを確認します。これは、バックボーンの非現行バージョンの代わりに

if (!attrs.first_field) 
    errors.push('You must add a first field') 

if (!this.get('first_field')) 
    errors.push('You must add a first field')