如何创建在创建时可能无效的骨干模型?

时间:2012-03-14 20:41:28

标签: javascript backbone.js

我正在尝试使用以下方法创建骨干模型:

var newUser = new App.User({
    name: $('input[name=new_user_name]').val(),
    email: $('input[name=new_user_email]').val()
  });

进行以下验证:

App.User = Backbone.Model.extend({

  validate: function(attrs) {
    errors = [];
    if (_.isEmpty(attrs.name)) {
      errors.push("Name can't be blank");
    }
    if (_.isEmpty(attrs.email)) {
      errors.push("Email can't be blank");
    }

    return _.any(errors) ? errors : null;
  },
...
});

但是,当文本框值为空时,无法创建模型,因为验证失败。

有没有办法创建模型并运行isValid()来检查值是否正确?或者在创建模型之前还有其他方法来运行验证吗?

backbone model creation code开始,它会在验证失败时抛出异常Error("Can't create an invalid model"),但是可以预先检查验证吗?

3 个答案:

答案 0 :(得分:3)

您可以使用silent: true创建无效模型,但这样集合就不会发生事件'添加'。但您可以将默认选项发送到函数add并在validate()

中捕获此选项
collection.add({option:'unvalid_value'}, {validation: false});
Model = Backbone.Model.extend({
  validate: function(attributes, options){
    if (options.validation === false)
      return;
    //Validation code
    //.....       
  }
});

这样你就可以用无效的哈希创建模型了

答案 1 :(得分:1)

我的理解是你想要创建一个用户模型,并且该模型会根据某些表单输入填充属性。

你现在设置它的方式,对我来说似乎不是非常中立的。

var newUser = new App.User({
    name: $('input[name=new_user_name]').val(),
    email: $('input[name=new_user_email]').val()
});

对我而言,感觉就像是在混淆视图中发生的事物与模型,这是它应该代表的对象。我可能首先创建一个基本的空白模型,然后创建一个赞美这个模型并传递模型的视图。

User = Backbone.Model.extend ({
    defaults: {
        name: undefined,
        email: undefined
    }
)};

UserView = Backbone.View.extend ({
    events: {
        // like click on submit link, etc.
        'click #submitButton': 'onSubmit'
    },
    initialize: function() {
        this.user = this.model;
    },
    onSubmit: function() {
        // run some validation on form inputs, ex. look for blanks, then...
        if ( /* validation passes */ ) {
            var nameEntered = $('input[name=new_user_name]').val();
            var emailEntered = $('input[name=new_user_email]').val();
            this.user.set({name:nameEntered, email:nameEntered});
        }
    }
});

// Do it!
var newUser = new User();
var newUserView = new UserView({model:newUser});

验证表单INPUT而不是Model属性的一种好方法是使用jquerytools验证器。它适用于HTML5属性,例如pattern = regex和type = email,并且非常简单。

答案 2 :(得分:1)

您无法在骨干网中创建无效模型。

如果要创建模型并将值传递给构造函数,则不会进行验证。

如果要通过fetch将模型添加到集合中,则无效数据将导致模型验证失败,并且模型将不会添加到集合中。这应该会触发error事件,因此您应该在服务器提供无效数据时进行监听。

如果您想制作模型,但要确保数据有效,您必须:

var mymodel = new MyModel();
mymodel.set(attrs);

即使你试图在模型瞬发期间传递{silent: false},骨干网也会覆盖它,因为它不会让你创建一个无效的模型并且不会抛出错误。 (我们不在这里讨论)

您可以通过查看来源查看此内容,还可以查看此github ticket