Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何创建在创建时可能无效的主干模型?_Javascript_Backbone.js - Fatal编程技术网

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

Javascript 如何创建在创建时可能无效的主干模型?,javascript,backbone.js,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

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

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以检查值是否正确?或者在创建模型之前是否有其他方法来运行验证


从中,它似乎抛出异常错误验证失败时无法创建无效的模型,但是否可以先检查验证?

我的理解是,您希望创建一个用户模型,并且该模型会根据一些表单输入填充属性

你现在的设置方式,对我来说似乎不是很有骨气

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});

验证表单输入而不是模型属性的一个好方法是使用jquerytools验证器。它与HTML5属性(如pattern=regex和type=email)一起工作,使它变得非常简单。

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

你现在的设置方式,对我来说似乎不是很有骨气

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});

验证表单输入而不是模型属性的一个好方法是使用jquerytools验证器。它与HTML5属性(如pattern=regex和type=email)配合使用,非常简单。

您不能在主干中创建无效的模型

如果您正在创建模型并将值传递给构造函数,则不会进行任何验证

如果通过fetch将模型添加到集合中,则无效数据将导致模型验证失败,并且模型将不会添加到集合中。这将触发错误事件,以便在服务器返回无效数据的情况下侦听它

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

var mymodel = new MyModel();
mymodel.set(attrs);
即使您尝试在模型实例化期间传递{silent:false},主干也会覆盖它,因为它不会让您创建无效的模型,也不会抛出错误。我们这里没有讨论


您可以通过查看源代码看到这一点,但也可以查看这一点,您不能在主干中创建无效的模型

如果您正在创建模型并将值传递给构造函数,则不会进行任何验证

如果通过fetch将模型添加到集合中,则无效数据将导致模型验证失败,并且模型将不会添加到集合中。这将触发错误事件,以便在服务器返回无效数据的情况下侦听它

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

var mymodel = new MyModel();
mymodel.set(attrs);
即使您尝试在模型实例化期间传递{silent:false},主干也会覆盖它,因为它不会让您创建无效的模型,也不会抛出错误。我们这里没有讨论


您可以通过查看源代码看到这一点,但也可以查看这一点。

您可以使用silent:true创建未验证的模型,但通过这种方式,collection don't trow event'add'。但您可以将默认选项发送到函数add,并在validate中捕获该选项

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

通过这种方式,您可以使用无效散列创建模型

您可以使用silent:true创建未经验证的模型,但通过这种方式,集合不“trow event”add。但您可以将默认选项发送到函数add,并在validate中捕获该选项

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

通过这种方式,您可以使用无效散列创建模型

我是主干网新手,但在我看来,它似乎将选项silent:true传递给set方法,set方法将该选项传递给validate,而truthy silent属性绕过了验证:我相信{silent:true}仅用于抑制通过更改模型触发的事件。所以如果我model.set{name:'orange'},{silent:true};它将防止触发模型更改事件,因此,将对此模型的更改事件做出反应的任何侦听器都不会执行。如果您有一个绑定到模型更改并相应地反映了更改的视图,这将非常方便。例如,model.bind'change',this.onChange,this我是主干网的新手,但在我看来,它似乎在向set方法传递选项silent:true,set方法将该选项传递给validate,而truthy silent属性绕过了验证:我相信{silent:true}仅用于抑制更改模型所触发的事件。所以如果
I model.set{name:'orange'},{silent:true};它将防止触发模型更改事件,因此,将对此模型的更改事件做出反应的任何侦听器都不会执行。如果您有一个绑定到模型更改并相应地反映了更改的视图,这将非常方便。例如,model.bind'change',this.onChange,this也不是我答案的一部分,但我已经为主干编写了一个模型验证混合。关于模型验证如何派上用场的好观点。在这个问题中,没有明确提到服务器端和获取的概念,但我认为这个答案展示了一个完整的基于主干网的项目的另一面。我认为模型验证和输入验证是一个重要的概念。问题的细节涉及服务器方面,但这直接回答了这个问题。我想人们也会来这里寻找这个基本问题的答案。此外,您还可以使用模型验证通过侦听errr消息来提供输入验证。有点绕圈,但可能。执行var newUser=new App.User的问题;验证检查的是空名称和电子邮件,所以这一行将失败。另外,如果创建失败,则无法附加错误处理程序,因为对象未创建。@zlog但不会失败。阅读我和杰里米之间的github评论。非常明确地说,主干将始终从new返回有效的模型。此时不调用验证。这就是为什么你应该在我的回答中使用代码。这就是如何建立模型并确保数据有效。这是收集的方式,它也不是我答案的一部分,但我已经为主干写了一个模型验证混合。关于模型验证如何派上用场的好观点。在这个问题中,没有明确提到服务器端和获取的概念,但我认为这个答案展示了一个完整的基于主干网的项目的另一面。我认为模型验证和输入验证是一个重要的概念。问题的细节涉及服务器方面,但这直接回答了这个问题。我想人们也会来这里寻找这个基本问题的答案。此外,您还可以使用模型验证通过侦听errr消息来提供输入验证。有点绕圈,但可能。执行var newUser=new App.User的问题;验证检查的是空名称和电子邮件,所以这一行将失败。另外,如果创建失败,则无法附加错误处理程序,因为对象未创建。@zlog但不会失败。阅读我和杰里米之间的github评论。非常明确地说,主干将始终从new返回有效的模型。此时不调用验证。这就是为什么你应该在我的回答中使用代码。这就是如何建立模型并确保数据有效。它是集合如何做的itI做了类似的事情,在视图中声明我的模型,但我想我也想在我的主干视图中使用主干模型中的验证,也就是说,你有/*验证通过*/我做了类似的事情,在视图中声明我的模型,但是我想我也想在我的主干视图中使用主干模型中的验证,也就是说,这里有/*验证通过*/