Backbone.js:在set上运行验证和触发错误事件,但如果验证失败,则不要中止设置

时间:2012-03-29 02:43:00

标签: validation backbone.js

我有一个Backbone模型,它带有一个自定义验证方法,可以验证模型属性之一的格式。我的模型连接到一个通过文本字段公开所述属性的视图。该视图有一个“保存”按钮,用户必须明确按此按钮才能将模型更改保存回服务器。

当用户键入无效的属性值时,我想直观地将该字段标记为处于无效状态。到目前为止,很简单 - 我可以将输入字段的change事件绑定到调用myModel.set({ attribute: value })的函数,并在模型上侦听"error"事件以告知验证何时失败并且我应该标记输入无效。

当我想要处理单击保存按钮时出现问题。因为如果验证失败,Backbone.Model.set中止实际设置模型上的属性,我的模型将无法准确反映用户输入的值,除非该值有效。当用户在键入无效值后单击“保存”时,我会检查模型是否有效,发现它是否(因为实际上从未设置过无效属性),并将旧的(有效)属性值保存到服务器。

我想要的是set的版本,它始终发出请求的更改,但仍然会触发验证和事件。 set(..., { silent: true })将允许更改通过,但不会运行验证或触发事件。

简而言之 - 我希望我的模型有时会处于无效状态(如果用户输入了无效的属性值),并且我希望能够在有效和无效之间转换时获取事件。有没有一种优雅的方式与骨干做这件事,或者我是否认为这完全错了?

2 个答案:

答案 0 :(得分:5)

我建议你使用这个骨干验证插件https://github.com/thedersen/backbone.validation 非常有帮助。 对于您的用例(即使它们无效也允许设置值), 你只需要覆盖模型的set函数。

    set: function (key, value, options) {
        options || (options = {});
        options = _.extend(options, { forceUpdate: true });
        return Backbone.Model.prototype.set.call(this, key, value, options);
    }

' forceUpdate' backbone.validation的属性允许validate方法返回true,同时仍然要求验证。 保存点击后,您可以致电

      var errors = model.validate(model.validate.attributes);

这将返回模型的所有错误,您可以正确显示它们。 您还可以自由使用有效和无效的回调

答案 1 :(得分:2)

我对这种验证所做的是在保存点击之前重置输入中的模型属性(只有在设置没有失败时才进行保存)

这样点击保存按钮会触发验证 - 触发错误。

这意味着模型始终有效,您无法进入下一页,直到输入全部有效。