Backbone模型验证不触发

时间:2014-02-12 22:44:07

标签: backbone.js

我已经覆盖了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

2 个答案:

答案 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 });