我的Backbone应用程序的第一个状态是从服务器呈现的。我不需要在页面加载时触发路由器,因为我正在引导我的模型:
我初始化应用程序:
window.App = {
init:function(root){
this.root = root;
this.router = new AppRouter();
Backbone.history.start({pushState:true, silent:true});
}
}
路线[S]:
var AppRouter = Backbone.Router.extend({
routes : {
"" : "index",
"profile/:id" : "profile",
},
profile: function(id){
var user = new App.Models.User({id: id});
var view = (new App.Views.Profile({model:user})).render().el
App.root.empty().append(view)
}
查看:
App.Views.Profile = Backbone.View.extend({
events:{
"click #toggle" : "toggleTab"
},
initialize:function(opts){
this.model.on('sync', this.render, this);
this.model.fetch();
},
template: Handlebars.templates['profile.hbs'],
render: function(){
this.$el.html(this.template());
return this;
},
toggleTab:function(){...}
我正在将silent: true
传递给Backbone.history,因此初始路由不会被触发,因此click
事件不会被绑定。对于不触发路由器的事件,会发生这种情况。
我真的不想在页面加载时触发路由器并重新渲染/获取。在这种情况下,navigate
不是一种选择。
如何在这种情况下绑定这些事件?
出于搜索引擎优化的原因,服务器呈现html意味着我已经拥有了html和数据(我真的不需要empty()
,重新渲染,触发或获取任何内容。
我在服务器和客户端都使用handlebars。
我知道这里的问题是“初始页面”不是“Backbone.View”,所以它不会得到事件绑定。
我可以通过生成视图轻松触发路由器和/或替换内容,但由于我已经拥有了所有内容,我试图不这样做。
我应该只引导模型并重新渲染html吗?
是否有最佳实践?