4

バックボーンとマリオネットを使用しています。バックエンドからモデルを取得しています。
モデルはコレクションに属しています。問題は次のとおりです

。1) 初期化内から明示的に指定しない限り、validate メソッドが呼び出されることはありません。なんで?
2) 検証メソッドを明示的に呼び出すと、テスト用に作成した無効なモデルが正しく返されます。しかし、「無効な」イベントをキャッチできません。私は何を間違っていますか?

モデルは次のとおりです。

 var Job = Backbone.Model.extend({
    validate: function(attrs){
        if (! attrs.title ) {
            return "A job should have a title";
        }
    },

    initialize: function(){

        this.validate(this.attributes); //manual call to validate
        this.on("invalid",  function(model, error){ //never executed even when the validate model returns the error string
            console.log(error);
        });

    }

});

そしてここにコレクション:

var JobList = Backbone.Collection.extend({
        model: Job,
        url: '/api/1.0/jobs/',
        parse: function(response) {
          return response.results;
        }

    });
4

1 に答える 1

5

Backbone で検証ロジックが変更されました0.9.10change logから引用すると、検証は次のように機能するようになりました。

モデルの検証は、{validate:true} オプションが渡されない限り、Model#save でデフォルトでのみ適用され、構築時または Model#set ではデフォルトで適用されなくなりました。

そのため、初期化または でモデルを検証する場合は、オプションをコンストラクター / メソッドsetに渡す必要があります。validate:true

invalidメソッドを手動で呼び出すときにイベントを受信しない理由model.validateは、バックボーンが検証を実行していないためです。モデルで定義したメソッドを呼び出しますが、Backbone はそれについて何も知りません。

Backbone でのモデルの検証は、Backbone がモデルで呼び出されるメソッドを定義しないという意味で、規約に基づいてvalidateいます。自分で行います。ただし、そのようなメソッドを定義している場合は、検証が発生したときに Backbone がそれを呼び出します ( on save、またはコンストラクター/セッター withvalidate:trueで、invalidイベントがトリガーされます。

于 2013-01-26T13:59:18.663 に答える