我有一个Backbone模型,它带有一个自定义验证方法,可以验证模型属性之一的格式。我的模型连接到一个通过文本字段公开所述属性的视图。该视图有一个“保存”按钮,用户必须明确按此按钮才能将模型更改保存回服务器。
当用户键入无效的属性值时,我想直观地将该字段标记为处于无效状态。到目前为止,很简单 - 我可以将输入字段的change事件绑定到调用myModel.set({ attribute: value })
的函数,并在模型上侦听"error"
事件以告知验证何时失败并且我应该标记输入无效。
当我想要处理单击保存按钮时出现问题。因为如果验证失败,Backbone.Model.set
中止实际设置模型上的属性,我的模型将无法准确反映用户输入的值,除非该值有效。当用户在键入无效值后单击“保存”时,我会检查模型是否有效,发现它是否(因为实际上从未设置过无效属性),并将旧的(有效)属性值保存到服务器。
我想要的是set
的版本,它始终发出请求的更改,但仍然会触发验证和事件。 set(..., { silent: true })
将允许更改通过,但不会运行验证或触发事件。
简而言之 - 我希望我的模型有时会处于无效状态(如果用户输入了无效的属性值),并且我希望能够在有效和无效之间转换时获取事件。有没有一种优雅的方式与骨干做这件事,或者我是否认为这完全错了?
答案 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)
我对这种验证所做的是在保存点击之前重置输入中的模型属性(只有在设置没有失败时才进行保存)
这样点击保存按钮会触发验证 - 触发错误。
这意味着模型始终有效,您无法进入下一页,直到输入全部有效。