1

次のコードの何が問題になっていますか?

(function(){

    window.App = {
        Models: {},
        Collections: {},
        Views: {}
    };

    window.template = function(id) {
        return _.template($('#' + id).html());
    };

    App.Models.Task = Backbone.Model.extend({
        defaults:{
            title: '',
            priority: 0
        },

        validate: function(attrs, options){
            if (attrs.priority < 0){
                return 'Priority cannot be negative.';
            }
        }
    });

    var task = new App.Models.Task ({ title: 'Sample Task', priority: 5 });
    task.on('invalid', function(model, error) { console.log(error); })

    task.save({ priority: -9 }); // Should not pass validation
    console.log(task.validationError); // Prints a validation error

    console.log(task.toJSON()); // Model is updated with -9
    console.log(task.isValid()); // false
})();

出力:

Priority cannot be negative. app.js:27
Priority cannot be negative. app.js:30
Object {title: "Sample Task", priority: -9} app.js:32
Priority cannot be negative. app.js:27
false 

私は現在、ビデオチュートリアルを見ています。これは、デフォルトでsetメソッドに検証が適用されていた古いバージョンの backbone.js に基づいています。しかし、現在のバージョンでは、検証はデフォルトでsaveメソッドに適用されます。

しかし、それは有効な値ではなく、検証に合格しないにもかかわらず、値を -9 に設定しているのはなぜですか。バリデーションが通らない場合は値を設定しないはずではないですか?

4

4 に答える 4

3

新しいバージョンでは、新しいデータを保存するときに、検証オプションを渡す必要があります。

task.save({ priority: -9 }, {validation: true});
于 2013-03-29T10:02:03.990 に答える
1

これは、公式サイトのコードの問題です。関数のソースを見ると、 to が呼び出された後にto のプリセットが行われることがsaveわかります。options.validatetrueset

行の順序を入れ替えることができます (のsave関数でModel):

  if (attrs && (!options || !options.wait) && !this.set(attrs, options)) return false;

  options = _.extend({validate: true}, options);

に:

   options = _.extend({validate: true}, options);

   if (attrs && (!options || !options.wait) && !this.set(attrs, options)) return false;

しかし、それが他の何かを壊さないかどうかはわかりません。

または、GitHub リポジトリのコードを使用できます - これを解決する変更があります。

于 2013-04-03T23:16:57.290 に答える
0

OK、フラグ「wait」を true に設定するか、「validate」フラグを true に設定するだけです。どうですか?そうですね、wait フラグを true に設定しないと、検証の前に save メソッドに渡したオプションを使用して set メソッドが呼び出されます。したがって、validate フラグを渡す必要がなかったため、set メソッドはそれを受け取らず、検証を実行せず、属性を設定します。
ドキュメントは待機フラグについて明確ではないため、サーバーは更新されたデータを引き続き受信します。

于 2013-03-29T16:52:02.790 に答える