3

开始学习 Backbone,尝试在我的 Person 模型中进行一些简单的验证,但是当我设置一个新的年龄时,验证方法似乎没有运行。谁能解释我在这方面可能出错的地方?在我做对之前不想继续我的学习。

JS

var Person = Backbone.Model.extend({

    defaults: {
        name: 'John Doe',
        age: 30,
        occupation: 'working'
    },

    validate: function(attrs) {

        console.log(attrs);

        if ( attrs.age < 0 ) {
            return 'Age must be positive, stupid';
        }

        if ( ! attrs.name ) {
            return 'Every person must have a name, you fool.';
        }

    },

    work: function() {
        return this.get('name') + ' is working.';
    }

});

目前我只是在控制台中获取和设置值,所以:

var person = new Person({
    name: 'Lady Madonna',
    age: 23
});

person.on('error', function(model, error){
    console.log(error);
});

当我将年龄设置为负值时,验证方法不会生效:

person.set('age', -55);
4

3 回答 3

10

Backbone 0.9.10 中更改了模型验证:

模型验证现在仅在 Model#save 中默认强制执行,并且在构造或 Model#set 中不再默认强制执行,除非{validate:true}通过了该选项。

并注意

模型验证现在会触发invalid事件而不是error

所以你的代码应该写成

var person = new Person({
    name: 'Lady Madonna',
    age: 23
});

person.on('invalid', function(model, error){
    console.log(error);
});

person.set('age', -55, {validate : true});

还有一个小提琴http://jsfiddle.net/nikoshr/aUxdS/

于 2013-03-25T12:31:36.990 回答
3

默认情况下,validate()在调用方法之前被调用save()。如果您还希望在之前调用它set(),则应指定 { validate : true } 选项,例如:

person.set({ age : -55 }, { validate : true });
于 2013-03-25T12:30:39.350 回答
0

这是我不久前写的一个例子。希望能帮助到你:

因此,假设您有一个名为 Animal 的模型:

var Animal = Backbone.Model.extend({
    defaults:  {
        name: '',
        speech: ''
    },
    validate: function(attribs) {
        if(attribs.name === ''){
            return "Your animal does not have a name.";
        }
    },
    initialize: function() {
        console.log('New Animal creation');
        this.on("change:name", function() {
            console.log("Change captured");
        });
        this.on("error", function(model, error) {
            console.log(error);
        });
    }
});

因此,当您在 javascript 中的某个地方执行以下操作时:

var dog = new Animal();
dog.set('speech', 'kef');

您将收到以下消息/错误:

"Your Animal does not have a name."

现在在创建新对象“dog”时不会调用验证。你真的需要使用 dog.set() 来设置它。

否则不会产生错误。

通过稍后更改该值,它也可能不会给出此错误。(你真的需要使用 set 我猜)。

但是,您始终可以检查模型是否处于 Valid 状态,如下所示:

Model.isValid().

当模型无效时,这将返回 false。所以这:

var dog = new Animal();
dog.isValid(); //would return a 'false' 

dog.set({
    'speech': 'kef',
    'name': 'fido'
});
dog.isValid(); //would return a 'true'

希望这可以帮助!

于 2013-03-25T12:37:45.893 回答