我正在尝试使用以下方法创建骨干模型:
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")
,但是可以预先检查验证吗?
答案 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