我已经覆盖了Backbone.Model并使用validate方法扩展了我自己的Model,但是在使用包含validate:true标志的集合更新模型时似乎没有触发。
Mod.Field.Model = App.Base.Objects.BaseModel.extend({
url: "../WebServices/Myclass.asmx/GetData",
defaults: {
DisplayName: ""
},
validate: function (attrs) {
if (attrs.DisplayName == "") {
return "DisplayName cannot be an empty string.";
}
}
});
在我的CollectionView中:
item_view.model.set({ "DisplayName": event.target.value }, { silent: false, validate: true });
在调用set时,似乎没有任何东西触发模型上的validate方法。我也尝试过调用它:
item_view.model.isValid();
但这也不会触发它。
使用Backbone版本1.1
答案 0 :(得分:0)
下面这段代码有效....但问题仍然是为什么上面的代码不适用于被覆盖的模型?
Mod.Test = {};
Mod.Test.Model = Backbone.Model.extend({
url: "",
defaults: {
DisplayName: ""
},
validate: function (attr) {
if (attrs.DisplayName == "") {
return "DisplayName cannot be an empty string.";
}
}
});
Mod.Test.ItemView = Marionette.ItemView.extend({
tagName: "div"
});
var newView = new Mod.Test.ItemView({
model: new Mod.Test.Model()
});
newView.model.set({ "DisplayName": 123 }, { validate: true });
newView.model.get("DisplayName");
刚刚测试了另一个场景。我使用示例代码替换了我的被覆盖的Mod.Test.Model并且它可以工作。罪魁祸首似乎是我从模型的CompositeView获取视图的方式。
updateItem: function (event) {
var event_target = $(event.target);
var zero_length = event.target.value.length == 0 ? true : false;
var item_view = this.children.findByCid(event_target.attr("data-viewcid"));
答案 1 :(得分:0)
这个问题最终成了我已经覆盖的Collection,它将默认模型设置为我实际上没有使用的模型。
这解决了这个问题:
this.collection = new App.Base.BaseCollection(this.model.get("mydata"), { model: Mod.Field.Model });