Javascript 主干路由器创建多个视图,导致多个事件绑定到同一个视图
我不熟悉backbone.js,试图了解路由、视图等是如何工作的,现在我遇到了为同一视图构建事件的问题。这里有一个剪辑,它将告诉你我的确切意思 这就是我的主干路由器的样子Javascript 主干路由器创建多个视图,导致多个事件绑定到同一个视图,javascript,backbone.js,backbone-events,Javascript,Backbone.js,Backbone Events,我不熟悉backbone.js,试图了解路由、视图等是如何工作的,现在我遇到了为同一视图构建事件的问题。这里有一个剪辑,它将告诉你我的确切意思 这就是我的主干路由器的样子 var Router = Backbone.Router.extend({ routes: { "pages": "pages", } pages: function () { var page_view = new PageView(); } }); 因此,
var Router = Backbone.Router.extend({
routes: {
"pages": "pages",
}
pages: function () {
var page_view = new PageView();
}
});
因此,当我点击Pages链接时,我创建了一个新的PageView,这就是我正在使用的代码
PageView = Backbone.View.extend({
el: $("#content"),
initialize: function () {
$.ajax({
url: '/pages',
success: function (data) {
$("#content").html(data);
}
});
},
events: {
"click td input[type=checkbox]": "updatePublishedStatus"
},
updatePublishedStatus: function (event) {
console.log('update publish status');
}
});
我想这是相当基本的,但正如你在剪辑中看到的,每次我导航到/页面时,我都会在复选框中注册另一个事件 移动
var page\u view=new PageView()
到Router.pages()之外
让PageView.initialize()
success回调函数将data
保存到变量。在页面视图中或在模型中
将render
函数添加到设置$(“#内容”).html(数据)的PageView
代码>
在Router.pages()中调用page\u view.render()
这里有一些问题
您的视频表明页面是一个集合,页面
<代码>页面
是主干。模型
具有页面名称、slug、published等属性。。。如果你没有,那会很痛的。您不应该只加载一些html并将其推送到DOM中,这违背了使用主干网的全部目的
如果您确实为页面创建了一个模型,它将具有一个视图。然后您的页面/路线将显示收藏页面等的视图
您将不在视图的initialize中获取数据,而是通过执行pages.fetch()代码>其中页面是页面
集合的实例。这可能发生在您甚至初始化路由器之前
通过视图更改属性时,将更新各个模型
作为旁白:在初始化时获取数据并不好。您可以在实际获取数据之前调用render(),这一点都不好玩。
也可以使用视图的$el来代替执行$('#content')
。如this.$el.html(…)代码>在这种情况下,可以在获取数据之前调用render。好的,我知道应该使用模型和集合。我使用asp.NETMVC,当调用/pages时,我只返回一个包含所有html和数据的部分视图,因为我还没有弄清楚如果不使用部分视图,如何使它在启用或不启用javascript的情况下工作。您是否有过使用asp.net mvc创建富web应用程序的经验,该应用程序也没有架构性,并且在不启用javascript的情况下工作?没有人抱歉,我没有,我喜欢我的python;)但是如果你的目标是开发一个不依赖javascript的应用程序,而忽略了在主干视图后面有模型的想法,那么你首先应该重新考虑使用主干。。。我想我会想出一个解决方案,我同意你的观点,我应该使用模型和集合。在获取数据之前渲染有那么糟糕吗?如果视图呈现为空,然后在触发“重置”事件时重新呈现或更新,这并不是那么糟糕。@PaulHoenecke不,这是次要的,但至少需要绑定才能重置。