Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Backbone.js模型仅在集合上验证->;保存(不在获取时)_Backbone.js - Fatal编程技术网

Backbone.js模型仅在集合上验证->;保存(不在获取时)

Backbone.js模型仅在集合上验证->;保存(不在获取时),backbone.js,Backbone.js,警告:我正在使用一个我无法完全控制的后端,因此我正在努力解决主干中的一些问题,这些问题可能在其他地方得到更好的解决……不幸的是,我别无选择,只能在这里处理它们 所以,我的问题是,我真的很想验证表单中的用户输入(当我在主干模型上用它设置值时),但是我从新创建的对象上的API接收的模型(通过只接受名称并且只返回名称和对象id的帖子)将无法通过我的验证检查 例如,当在数据库中创建一个新对象时,两个键字段将填充为空字符串(因此,当主干命中API并填充模型时,它将用空字符串填充这些键)。当用户保存这些对象

警告:我正在使用一个我无法完全控制的后端,因此我正在努力解决主干中的一些问题,这些问题可能在其他地方得到更好的解决……不幸的是,我别无选择,只能在这里处理它们

所以,我的问题是,我真的很想验证表单中的用户输入(当我在主干模型上用它设置值时),但是我从新创建的对象上的API接收的模型(通过只接受名称并且只返回名称和对象id的帖子)将无法通过我的验证检查

例如,当在数据库中创建一个新对象时,两个键字段将填充为空字符串(因此,当主干命中API并填充模型时,它将用空字符串填充这些键)。当用户保存这些对象时,在编辑后,我想强制他们为这两个键输入值——这非常容易,因为主干网内置了验证方法

当然,问题是验证同时在fetch->set(不需要的行为)和set->save(需要的行为)上启动,因此新创建的模型根本不会加载……主干网收集它们,验证失败,并触发错误

所以,我的问题是:是否有一种“主干-y”方法只在set->save上验证模型,而不是在fetch->set上验证模型?我可以用一个特定的触发器来解决这个问题吗


任何想法都将不胜感激。

主干.Model.set
如果传入
{silent:true}
,则不会执行验证,
fetch
会将任何选项传递给set,因此,您可以重写
fetch
,或者编写自己的
fetchSilent
方法,在options对象中传递该方法

但是,您可能会在使用
Backbone.Collection.fetch
时遇到一些小问题,因为当它从服务器接收属性时,它不会使用
set
创建新模型。相反,它使用
model=newthis.model(attrs,{collection:this})创建一个新模型validate
方法,则执行验证

这有点烦人。您可以通过在集合(如果您正在使用)上定义一个
parse
方法(使用
{silent:true}
)来绕过它,因为当
Backbone.collection.add
收到一个完全形成的主干模型时,它不会运行验证。(请参阅中的
\u add
\u prepareModel
方法)


集合以这种方式工作有点烦人,但(至少现在)它就是这样。

您可以做另一件事,而不是覆盖fetch:

验证模型时,请检查是否存在
model.silent
,并仅在该模型不存在时进行验证

因此,当您要获取模型时,请执行以下操作:

var test = new MyModel({ id: '123', silent: true }); 

// in your Model validate function
validate: function(attrs) {
  if (!attrs.silent) {
    // validate logic here
  }
}

然后你可以取回模型。获得模型后,您可以取消设置静默,以备将来验证。

确实很烦人,但感谢您提供的提示--非常感谢。据我所知,在最新的源代码中,即使通过静默设置,主干也会在设置时进行验证,所以这不会有帮助