【问题标题】:backbone.js: model.save() is always successful although it shouldn'tBackbone.js:model.save() 总是成功的,虽然它不应该
【发布时间】:2013-11-26 18:39:28
【问题描述】:

我定义了一个模型“person”(和一个集合“persons”),它有两个字段 - 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 模块而不是服务器上的休息接口。

创建模型按预期工作 - 如果有名字和姓氏,我只能创建一个新人。在这种情况下,路由器会将我转发到“概览”。否则,什么都不会发生(警报除外)。

不幸的是,编辑人员总是会导致成功回调,即使我将两个名称都设置为空字符串。这意味着我被路由器转发,尽管它不应该发生。 但是:在这种情况下,localStorage 中的模型不会更新,因此验证在某种程度上是有效的。当点击保存按钮时,验证逻辑被调用了四次,第一次它返回一个长度 > 0 的错误数组,另外 3 次它返回 false。

为什么我总是收到成功回调?

编辑:

我将backbone.js 和underscore.js 更新为最新版本,并且行为发生了变化。如果没有原因,将不再调用成功回调,但也不会调用错误回调 - 在这种情况下它什么也不会发生。

【问题讨论】:

    标签: javascript backbone.js backbone-views


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,这当然可行,但我想了解我遇到的问题。但我解决了(见答案)。
    【解决方案2】:

    似乎我误解了错误回调;如果发生验证错误,它不会被调用。模式如下所示:

    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
            }
    

    【讨论】:

    • 或者换句话说:成功和错误的回调不是对立的。在某些情况下,既不会调用成功回调也不会调用错误回调。
    猜你喜欢
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2019-09-22
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多