2012-03-09 65 views
5

当首次创建新模型时,有没有一种方法可以在Backbone.js中抑制模型验证?阻止Backbone.js模型从第一次添加到集合时进行验证

在我的应用程序中,我有一个任意数量的模型的集合,它们被表示为列表项。用户可以点击每个项目上的按钮,在当前项目下插入一个新的空项目。显然,空项目验证失败,因为我不想在稍后保存空项目。

当我创建新项目时,我无法知道什么是合理的默认值,因此使用有效数据预先填充新模型似乎不是一种选择。

有什么建议吗?

更新:在处理切线相关的问题时,我意识到我使用的是Backbone.js 0.9.0版。当这个版本发布时,其他人遇到了同样的问题,他们在GitHub的this issue上投诉。

Jeremy修改了0.9.1中的验证来解决这个问题。将(暂时)空模型添加到集合中是一种有效的现实世界用例。您可以在视图中处理新的空模型,但是如果您像管理项目列表一样管理项目列表,则会强制您收集项目视图(包括空白视图)无效的模型。对于其他直截了当的情况来说,这是一个非常笨拙的解决方法。很高兴这已得到修复。

回答

3

你不应该添加无效的模型:)

挖骨干源代码位(0.9.1至少)表明,该机制可以通过传递选项,你的add方法来回避:

var Mod=Backbone.Model.extend({ 
    validate: function(attrs,opts) { 
     if (opts.init) return; 
     return "invalid"; 
    } 
}); 

var Col=Backbone.Collection.extend({ 
    model:Mod 
}); 

var c=new Col(); 
c.add({},{init:true}); 

console.log(c.length); 

小提琴:http://jsfiddle.net/jZeYB/

警告:它可能会破坏下来的东西就行了。

+0

不添加无效模型在理论上是有道理的,但我想不出让用户添加新行的更好方法。我想我可以在视图中处理所有这些内容,然后在该集合有效时将其添加到集合中,但这会使此应用程序的其他方面复杂化。你的例子工作的很好,但是当我在我的应用程序中尝试它时,'options'参数被'{silent:true}'对象覆盖,Backbone.js似乎自动鞋拔。我现在很困惑。 – 2012-03-09 13:12:51

+0

您不应该添加无效模型 - 视图应该捕获模型验证发送的'error'消息,并让用户修复它们的输入或将其取消。当我从我们的服务器中抽取东西时,获取无效数据我只是将它放在地板上(并将消息发送到我们的Ajax日志记录工具),因为集合中的无效模型是'坏主意' – tkone 2012-03-10 14:41:13

2

您是否需要将模型添加到集合中?我认为验证失败,因为您立即将它添加到集合中。

相反,当按下按钮时,您可以创建视图和空白模型。模型验证后,将其添加到集合中。您需要在新行上提交按钮/机制才能将其添加到集合中(这会自动调用验证)。

+0

我打算给这个镜头。我大概可以在模型的'change'处理程序中添加该项,这将消除对提交按钮的需求。当该领域失去焦点时它会被添加。谢谢! – 2012-03-12 00:49:33