所以我一直在使用基本的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();`
任何帮助将不胜感激!
谢谢!
答案 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
,则在成功回调中将其添加到集合中