backbone.js:model.save()总是成功的,尽管它不应该成功

时间:2013-11-26 18:39:28

标签: javascript backbone.js backbone-views

我定义了一个模型'person'(以及一个'人''集合),它有两个字段 - firstName和lastName。有创造人的观点和编辑现有人的另一种观点。您可以对两个视图执行的唯一操作是设置名称。负责任的代码如下:

创建视图

create: function () {
        var form = $(this.el).find("#add_form");
        this.model = window.persons.create({
            firstName: form.find("#firstname").val(),
            lastName: form.find("#lastname").val()
        }, {
        success: function(){
            alert("success");
            window.router.navigate("overview", {trigger: true});
        },
        error: function() {
            alert("error");
        }
        });
    }

更新视图

update: function () {
        var form = $(this.el).find("#edit_form");
        this.model.set({
            firstName: form.find("#firstname").val(),
            lastName: form.find("#lastname").val()
        });
        this.model.save(null, {
            success: function(){
                alert("success");
                window.router.navigate("overview", {trigger: true});
            },
            error: function() {
                alert("error");
            }
        });
    }

模型的验证逻辑

validate: function(attrs) {
            var errors = [];
            if (!attrs.firstName || attrs.firstName.trim() === "") {
                errors.push({name: 'firstName', message: '...'});
            }
            if (!attrs.lastName || attrs.lastName.trim() === "") {
                errors.push({name: 'lastName', message: '...'});
            }
            //alert(errors.length);
            return errors.length > 0 ? errors : false;
        }

我正在使用localStorage模块而不是服务器上的rest接口。

创建模型按预期工作 - 如果有firstName和lastName,我只能创建一个新人。在这种情况下,路由器会将我转发给“概述”。否则,没有任何反应(警报除外)。

不幸的是,编辑人员总是会导致成功回调,即使我将两个名字都设置为空字符串也是如此。这意味着我可以通过路由器转发,但不应该发生。 但是:在这种情况下,localStorage中的模型不会更新,因此验证工作正常。当点击保存按钮时,验证逻辑被调用四次,第一次返回长度为>的错误数组。 0,其他三次返回false。

为什么我总能获得成功回调?

修改

我将backbone.js和underscore.js更新到最新版本并且行为已更改。如果没有理由,成功回调就不再被调用,但是也没有调用错误回调 - 在这种情况下它什么也没发生。

2 个答案:

答案 0 :(得分:0)

使用isValid()方法。运行validate以检查模型状态。

http://backbonejs.org/#Model-validationError

答案 1 :(得分:0)

我似乎误解了错误回调;如果发生验证错误,则不会被调用。模式看起来像这样:

model.save({
            // ...
        }, {
            success: function() {
                // gets called if EVERYTHING is okay
            },
            error: function() {
                // gets called if XHR errors or similar things occur
                // doesn't take validation errors into account
            }
        });
        if (this.model.validationError) {
            // this is for validation errors
        }