我的Backbone,RequireJS& jQuery移动应用程序。 当我使用表单视图2次时,表单提交事件被触发两次。 每个新视图都会添加到正文中,之前的视图将被删除。为此,我在app.js文件中使用此代码:
$(document).on("mobileinit", function () {
$.mobile.linkBindingEnabled = false;
$.mobile.hashListeningEnabled = false;
$(document).on('pagehide', 'div[data-role="page"]', function (event, ui) {
$(event.currentTarget).remove();
});
})
Router.js
define([
'jquery',
'backbone',
'views/projects/ProjectsView',
'views/projects/AddProjectView'
], function($, Backbone, ProjectsView, AddProjectView) {
return Backbone.Router.extend({
routes: {
'addProject': 'addProject',
'editProject/:projectId': 'editProject',
'*actions': 'showProjects' // Default
},
addProject: function() {
new AddProjectView().render();
},
editProject: function(projectId) {
require([
"views/projects/EditProjectView",
"collections/ProjectsCollection",
"models/ProjectModel"
], function (EditProjectView, ProjectsCollection, ProjectModel) {
var projectsCollection = new ProjectsCollection();
projectsCollection.fetch();
var project = projectsCollection.get(projectId);
if (project) {
var view = new EditProjectView({model: project, projectsCollection: projectsCollection});
view.render();
}
});
},
showProjects: function() {
new ProjectsView().navigate();
}
});
});
我已将我的代码上传到我网站上的目录:http://rickdoorakkers.nl/np2 如果您执行以下步骤,您将看到问题:
有人可以告诉我我做错了吗?
谢谢!
答案 0 :(得分:1)
Rido,你的代码对我来说真的很难读,因为它混合了一些东西而没有遵循Backbone的任何惯例。
对于您的具体问题,我感觉问题是您将编辑视图和新视图绑定到正文(el:body),都响应事件提交,并且您永远不会清楚地清理视图,所以我想每当你添加一个项目然后编辑它时,添加视图仍然在内存中,仍然绑定到提交事件,仍然用新名称回答call = new项目,而不是编辑。
通过在添加后添加对stopListening的调用,以一种肮脏的方式修复是“容易的”,但真正的问题是你绑定到body,并且混合使用Backbone Router和手动哈希控件+其他奇怪的模式,比如每5行获取一次这个集合(你可以在应用程序的开头创建一个并且总是使用它!这里是本地存储,所以没关系,但如果你移动到远程存储,你会后悔的。 .. fetch()重置集合并执行完全重新加载!)。我建议你可以尝试重写这个,而不用关心jQuery mobile,只是试着让它与Backbone.Router一起工作+单个集合+不绑定到body但是反过来创建视图并将它们附加到body / remove什么时候完成?你会发现这些错误不那么奇怪,也更容易跟踪。