javascript - Backbone.js model.save() 发送多个 PUT 请求

标签 javascript jquery model-view-controller backbone.js

我有一个加载模型和一些模板的主干 View 。当我在编辑模板中提交表单时,backbone 成功发送了一个 PUT 请求,就像它应该的那样。成功后,我将用户导航回 View 模板。

但是,如果我再次导航到编辑路径并提交表单,backbone 会发送两个 PUT 请求。然后它获取 View 模板。如果我第三次导航到编辑路由,主干发送三个 PUT 请求。每次我提交表单时,PUT 请求的数量都在增加。为什么会这样?

这是我的看法:

// Filename views/users/edit.js
/*global define:false */

define([
    'jquery',
    'underscore',
    'backbone',
    'models/user/UserModel',
    'text!templates/users/edit.html',
], function($, _, Backbone, UserModel, UserTemplate) {

    var UserEdit = Backbone.View.extend({
        el: '#page',
        render: function (options) {

            var that = this;

            if (options.id) {
                // modify existing user
                var user = new UserModel({id: options.id});
                user.fetch({
                    success: function (user) {
                        var template = _.template(UserTemplate, {user: user});
                        that.$el.animate({opacity: 0}, 180, function() {
                            that.$el.html(template).animate({opacity: 1}, 180);
                        });
                    }
                });
            } else {
                // create new user
                var template = _.template(UserTemplate, {user: null});
                that.$el.animate({opacity: 0}, 180, function() {
                    that.$el.html(template).animate({opacity: 1}, 180);
                });
            }

        },
        events: {
            'submit #create-user-form': 'createUser'
        },
        createUser: function (e) {
            var postData = $(e.currentTarget).serializeObject();
            var user = new UserModel();
            user.save(postData, {
            success: function (user, response) {
                Backbone.history.navigate('#/users/view/' + response, {trigger: true, replace: true});
                }
            });
            return false;
        }
    });

    return UserEdit;

});

最佳答案

在我的例子中,我可以通过在成功回调的 View 上调用 undelegateEvents() 来修复它。

createUser: function (e) {
    var postData = $(e.currentTarget).serializeObject(),
            user = new UserModel(),
            that = this;

    user.save(postData, {
        success: function (user, response) {
            that.undelegateEvents();
            Backbone.history.navigate('#/users/view/' + response, {trigger: true});
        }
    });

    return false;
}

谢谢,@dbf。

关于javascript - Backbone.js model.save() 发送多个 PUT 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17525969/

相关文章:

javascript - 在手机上,当用户滚动屏幕顶部 "past"时检测

python - 在 QTableView 中显示分层模型项的详细信息

ruby-on-rails - 画出模型和 Controller 之间的界限

javascript - 如何使 jQuery .load() 将返回的数据附加到容器内而不是重写它?

javascript - 是否可以将文本附加到 SVG 中的文本元素?

javascript - 如何在物化CSS框架中动态修改<select>

javascript - 如何使第三方 javascript 函数使异步行为像 angular2 http 请求一样?

php - 发布到受密码保护的 URL?

javascript - 使用 Javascript 简单地基于标签的突出显示

javascript - jQuery 扩展图像下的图像组合