2013-01-15 35 views
2

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

以下是我的活动代码。 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();` 

任何帮助,将不胜感激!

谢谢!

+0

你有没有试过在你的saveUser函数上做一个console.log(回复),并且看到它在执行POST时返回的内容? –

+0

“POST请求不会触发相同的代码行,但会触发成功功能。”我很困惑。所以如果在'success'回调中添加'console.log(“Hi!”);',你会得到“嗨!”在POST和PUT上? – Lukas

+0

我试过控制台日志记录,Lukas是正确的。它成功登录控制台,但实际上并未触发路由器。 :/ – MelArlo

回答

3

问题是,当您创建新用户时,如果newUrl与当前网页网址不同,则您已经在网址""router.navigate(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 
+0

@MelArlo,我修复了答案,所以它应该现在工作,你能重试吗? – Lukas

+0

@MelArlo,现在你已经遇到了相反的问题。尝试连续创建两个新用户。你会得到同样的问题,因为现在你路由到'#new'。 – Lukas

+0

你不应该为这个问题使用路由器,是真正的问题 –

1

当您张贴,当前URL是 “http://gocella.com/backbone/#”,您发布后您导航到“http://gocella.com/backbone/#”它不会更改网址,它不会触发该事件。

路由器只会在URL更改时触发事件,它的工作原理来自更新,因为当您点击编辑您的URL时,更改为“http://gocella.com/backbone/#/edit/1”,然后触发器发生更改回到“http://gocella.com/backbone/#”

我认为这个问题使用路由器的方法是不全面的。

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

+0

我明白你在说什么帕特里克了,我会给你一个镜头。谢谢! – MelArlo

+0

调查骨干事件 –

+1

而不是在成功添加结果,为什么不使用'collection.create'? – Lukas