0

こんにちは、backbonejs を初めて使用します。

http://addyosmani.github.com/backbone-fundamentals/#validationの例を試しているときに問題が発生しました

モデルの 2 つのオブジェクト myTodo と myTodo1 を作成しました。

このようにset関数を呼び出すと、検証エラーのためにcompleted:falseが返されます

    var myTodo = new Todo();
    myTodo.set('完了', true, {validate: true});
    console.log("完了: "+myTodo.get('完了'));
    /*
    上記のコードは、次のログを返します。
    このモデルは初期化されました。
    Todo のタイトルを設定することを忘れないでください。
    完了: false
    */

以下のコードの実行時に検証が実行されない理由を購入する

    var myTodo1 = new Todo();
    myTodo1.set('完了',true);
    console.log("完了: "+myTodo1.get('完了'));
    myTodo1.set({validate:true})
    console.log("完了: "+myTodo1.get('完了'));
    /*
    上記のコードは、次のログを返します。
    このモデルは初期化されました。アンダースコア-test2.js:11
    完了: true underscore-test2.js:28
    完了: 真
    */

両方のコードセットが同じ仕事をしていますが、最初のケースでは検証が実行されますが、2番目のケースでは実行されません

どうして?????

以下は完全なサンプルコードです。

    var Todo = Backbone.Model.extend({
      デフォルト: {
        完了: false,
      }、
      検証: 関数 (属性) {
        if(attribs.title === undefined){
            return "ToDo のタイトルを忘れずに設定してください。";
        }
      }、
      初期化: 関数(){
        console.log('このモデルは初期化されました。');
        this.on("無効", 関数(モデル, エラー){
            console.log(エラー);
        });
        this.on('change:title', function(){
            console.log('- タイトルの値が変更されました。');
        });
      }
    });

    **var myTodo = new Todo();
    myTodo.set('完了', true, {validate: true});
    console.log("完了: "+myTodo.get('完了'));**

    **var myTodo1 = new Todo();
    myTodo1.set('完了',true);
    console.log("完了: "+myTodo1.get('完了'));
    myTodo1.set({validate:true})
    console.log("完了: "+myTodo1.get('完了'));**

4

1 に答える 1

1

それらは単に完全に異なります。

myTodo1.set({validate:true})

ここでは、検証を実行していません。モデルの属性「validate」を true に設定するだけです。基本的に、2 番目の例では、検証せずに 2 つの属性を設定しています。

いずれにせよ、属性はすでに設定されているため、後で検証を行うことは期待できません。

編集:
検証属性に新しい値を設定するときの動作はわかりません。しかし、確かに検証関数をブール値でオーバーライドしています。これは確かに予期しない動作につながります。

編集2:

わかりました、それが私の最後の試みになると思います。

myTodo1.set({completed:true});
myTodo1.set({validate:true});

以下と同等:

myTodo1.set({completed: true}).set({validate: true});

ただし、いずれの場合も、以下と同等ではありません。

myTodo1.set({completed: true}, {validate: true});

最後に{validate: true}、モデルに検証関数を適用するよう Backbone に指示します。

前者では、モデルに validate を指示せずに、 completed 属性を trueに設定するだけです。次に、モデルに検証を指示せずに、 validate属性をもう一度trueに設定します。したがって、基本的にモデルに検証するように指示することはありません

于 2013-04-06T13:11:33.127 に答える