gpt4 book ai didi

javascript - Backbone.js 仍在验证失败时设置模型属性

转载 作者:行者123 更新时间:2023-11-28 20:49:50 25 4
gpt4 key购买 nike

出于某种奇怪的原因,当我在模型验证中返回字符串时,我的模型仍在设置属性。这是我的代码验证代码:

Model = Backbone.Model.extend({
validate: function( attributes ){
var tax = attributes.tax;

if(tax.amount < 0.0 || typeof tax.amount !== "number"){
return "The tax amount cannot be negative and must be a number.";
}
},
defaults: {
"tax": {
"amount": 100
}
},
setTax: function(amount){
var tax = this.get("tax");
tax.amount = amount;
this.set("tax", tax);
}
})

然后我让模型监听错误事件并通过控制台记录它:

    model = new Model();

View = Backbone.View.extend({
initialize: function(){
this.model.on('error', function(model, error){
console.log("ERROR: " + error);
})
}
});
view = new View({model: model});
view.model.setTax(-100);

正在打印控制台日志,但由于某种原因模型仍在设置属性。我需要返回什么才能不让模型设置属性吗?根据 Backbone.js 码头,如果您从验证中返回任何内容,则假定未设置该属性。我正在使用 Backbone.js 版本 0.9.2

最佳答案

您的问题就在这里:

var tax = this.get("tax");

get 方法基本上返回 this.attributes[attr] 并且 tax 属性是一个对象,结果是你的 vartax 和模型的 this.attributes.tax 是同一件事。因此,当您说 tax.amount = amount 时,您实际上是在直接编辑模型属性内的tax

当使用可变属性(即除数字、字符串和 bool 值之外的任何属性)时,您需要在更改它们之前进行复制:

setTax: function(amount) {
var tax = _(this.get("tax")).clone();
tax.amount = amount;
this.set("tax", tax);
}

制作副本还可以防止 Backbone 认为您的 set 调用实际上没有执行任何操作。如果您不按照上面的方式克隆 tax,您将不会触发模型上的更改事件,而这可能不是您想要的。

一些示例(请打开您的控制台):

关于javascript - Backbone.js 仍在验证失败时设置模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12693998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com