【问题标题】:Prevent Backbone.js model from validating when first added to collection防止 Backbone.js 模型在首次添加到集合时验证
【发布时间】:2012-03-14 20:13:55
【问题描述】:

有没有办法在第一次创建新模型时抑制 Backbone.js 中的模型验证?

在我的应用程序中,我有一个包含任意数量模型的集合,这些模型表示为列表项。用户可以单击每个项目上的按钮,这会在当前项目下方插入一个新的空项目。显然,空项目未通过验证,因为我不希望稍后保存空项目。

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

有什么建议吗?

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

Jeremy 在 0.9.1 中修改了验证以解决此问题。将(临时)空模型添加到集合中是一个有效的实际用例。您可以在视图中处理新的空模型,但如果您像我一样管理项目列表,这将迫使您除了必须收集的项目视图(包括空视图)之外还有一个项目视图集合(包括空视图)。有效模型。对于原本简单的场景来说,这是一个非常笨拙的解决方法。很高兴这个问题得到了解决。

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    您不应该添加无效模型:)

    深入研究 Backbone 源代码(至少 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/

    警告:它可能会破坏线。

    【讨论】:

    • 理论上不添加无效模型是有道理的,但我想不出更好的方法来允许用户添加新行。我想我可以在视图中处理所有这些,然后在项目有效时将其添加到集合中,但这会使该应用程序的其他方面变得非常复杂。您的示例效果很好,但是当我在我的应用程序中尝试它时,options 参数被 { silent:true } 对象覆盖,Backbone.js 似乎会自动插入该对象。我现在很困惑。
    • 你不应该添加无效模型——视图应该捕获模型验证发送的error消息,并让用户修复他们的输入或取消它。当我从我们的服务器中拉取东西并获取无效数据时,我只是把它放在地板上(并向我们的 Ajax 日志记录工具发送一条消息),因为集合中的无效模型是一个“坏主意”
    【解决方案2】:

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

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

    【讨论】:

    • 我要试一试。我可能会在模型的change 处理程序中添加该项目,这将消除对提交按钮的需要。当字段失去焦点时,它会被添加。谢谢!
    猜你喜欢
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    相关资源
    最近更新 更多