Backbone.js路由器触发put,而不是post

时间:2013-01-15 20:19:22

标签: backbone.js backbone-routing

所以我一直在使用基本的Backbone.js来创建一个简单的演示页面,它是一个基本的用户管理器。无论是创建(POST)还是更新(PUT)用户的信息,我都运行相同的功能。 POST和PUT请求都成功(I.E.调用我的“成功”功能)但是只有PUT命令才会触发路由器,POST请求在触发成功功能时不会触发相同的代码行。

以下是我的活动代码。 saveUser函数负责处理PUT和POST请求,但成功的路由器仅从成功的PUT请求触发,而不是从成功的POST请求触发(即使两者都成功更新数据库)。

events: {
            'submit .edit-user-form': 'saveUser',
            'click .delete': 'deleteUser'
        },
        saveUser: function (ev) {
            var userDetails = $(ev.currentTarget).serializeObject();
            var user = new User();
            reply = user.save(userDetails, {
                success: function (){
                    router.navigate('', {trigger: true});
                },
                error: function(){
                    $("#editError").toggle();
                    $("#editError").html("Error:<br/>"+reply.status+" : "+reply.statusText+"<hr/>");
                }
            });
            return false;
        },
        deleteUser: function (ev){
            $.ajaxSetup({
                headers: {
                    'method':"DeleteUser"
                }
            });
            reply = this.user.destroy({
                success: function (){
                    router.navigate('', {trigger: true});
                },
                error: function(){
                    $("#editError").toggle();
                    $("#editError").html("Error:<br/>"+reply.status+" : "+reply.statusText+"<hr/>");
                }
            })
            return false;
        }

这是路由器代码:

    var Router = Backbone.Router.extend({
        routes:{
            'new': 'editUser',
            'edit/:id': 'editUser',
            '': 'home'
        }
    });
    var router = new Router();
    //ROUTES
    router.on('route:home', function(){
        alert("1");
        userList.render(),
        editUser.render({});
    });
    router.on('route:editUser', function(id){
        userList.render();
        editUser.render({id: id});
    });
    //NECESSARY
    Backbone.history.start();`

任何帮助将不胜感激!

谢谢!

2 个答案:

答案 0 :(得分:3)

问题在于,当您创建新用户时,您已经在网址"",而router.navigate(newUrl)仅在newUrl与当前网页网址不同时触发

请参阅https://github.com/documentcloud/backbone/issues/652

要修复,请更改

router.navigate('', {trigger: true});

Backbone.history.fragment = null; // Forces the current URL to be dirty
router.navigate('', {trigger: true}); // Now, Backbone thinks the new URL is different

答案 1 :(得分:1)

发布时,当前网址为“http://gocella.com/backbone/#”,发布后导航至“http://gocella.com/backbone/#”,不会更改网址,不会解雇此事件。

路由器仅在网址更改时触发事件,它在更新时起作用,因为当您点击编辑时,您的网址更改为“http://gocella.com/backbone/#/edit/1”,然后触发更改回来到“http://gocella.com/backbone/#”

我认为使用路由器解决这个问题的方法总体上是不正确的。

你应该做更多的事情: 当您点击保存,创建新模型或使用表单值更新现有模型,然后使用collection.create(modelFromForm),或者,如果您使用model.save,则在成功回调中将其添加到集合中