2

所以我一直在使用基本的 Backbone.js 创建一个简单的演示页面,它是一个基本的用户管理器。无论是创建(POST)还是更新(PUT)用户信息,我都会运行相同的功能。POST 和 PUT 请求都成功(IE 调用我的“成功”函数)但是只有 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();`

任何帮助,将不胜感激!

谢谢!

4

2 回答 2

3

问题是,当您创建新用户时,您已经在 url 处"",并且router.navigate(newUrl)只有newUrl在与当前页面 url 不同时才会触发。

请参阅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
于 2013-01-15T20:46:16.747 回答
1

当您发布时,当前 url 是“http://gocella.com/backbone/#”,在您发布后导航到“http://gocella.com/backbone/#”,这不会更改 url,它不会触发该事件。

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

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

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

于 2013-01-15T20:48:58.863 回答