我正在构建一个简单的骨干应用程序,它有4条路线:家庭,关于,隐私和条款。但在设定路线后我遇到了3个问题:
“条款”视图未呈现;
当我刷新#about或#privacy页面时,主页视图会在#about / #vacile视图后面呈现
当我点击后退按钮时,主视图永远不会呈现。例如,如果我在#about页面中,并且我点击主页的后退按钮,那么about视图会保留在页面中
我不知道第一个问题我做错了什么。我认为第2和第3个问题与家用路由器中缺少的东西有关,但我不知道是什么。
这是我的代码:
HTML
<section class="feed">
<script id="homeTemplate" type="text/template">
<div class="home">
</div>
</script>
<script id="termsTemplate" type="text/template">
<div class="terms">
Bla bla bla bla
</div>
</script>
<script id="privacyTemplate" type="text/template">
<div class="privacy">
Bla bla bla bla
</div>
</script>
<script id="aboutTemplate" type="text/template">
<div class="about">
Bla bla bla bla
</div>
</script>
</section>
观点
app.HomeListView = Backbone.View.extend({
el: '.feed',
initialize: function ( initialbooks ) {
this.collection = new app.BookList (initialbooks);
this.render();
},
render: function() {
this.collection.each(function( item ){
this.renderHome( item );
}, this);
},
renderHome: function ( item ) {
var bookview = new app.BookView ({
model: item
})
this.$el.append( bookview.render().el );
} });
app.BookView = Backbone.View.extend ({
tagName: 'div',
className: 'home',
template: _.template( $( '#homeTemplate' ).html()),
render: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
app.AboutView = Backbone.View.extend({
tagName: 'div',
className: 'about',
initialize:function () {
this.render();
},
template: _.template( $( '#aboutTemplate' ).html()),
render: function () {
this.$el.html(this.template());
return this;
}
});
app.PrivacyView = Backbone.View.extend ({
tagName: 'div',
className: 'privacy',
initialize: function() {
this.render();
},
template: _.template( $('#privacyTemplate').html() ),
render: function () {
this.$el.html(this.template());
return this;
}
});
app.TermsView = Backbone.View.extend ({
tagName: 'div',
className: 'terms',
initialize: function () {
this.render();
},
template: _.template ( $( '#termsTemplate' ).html() ),
render: function () {
this.$el.html(this.template()),
return this;
}
});
路由器:
var AppRouter = Backbone.Router.extend({
routes: {
'' : 'home',
'about' : 'about',
'privacy' : 'privacy',
'terms' : 'terms'
},
home: function () {
if (!this.homeListView) {
this.homeListView = new app.HomeListView();
};
},
about: function () {
if (!this.aboutView) {
this.aboutView = new app.AboutView();
};
$('.feed').html(this.aboutView.el);
},
privacy: function () {
if (!this.privacyView) {
this.privacyView = new app.PrivacyView();
};
$('.feed').html(this.privacyView.el);
},
terms: function () {
if (!this.termsView) {
this.termsView = new app.TermsView();
};
$('.feed').html(this.termsView.el);
}
})
app.Router = new AppRouter();
Backbone.history.start();
我错过了一些东西,但我不知道是什么。
由于
答案 0 :(得分:2)
我认为您需要将脚本模板移出.feed html元素,当您呈现HomeListView视图时,它将删除其内部的所有内容,然后脚本模板将对您调用的其他视图不可用HomeListView。
<section class="feed">
</section>
<script id="homeTemplate" type="text/template">
<div class="home">
</div>
</script>
<script id="termsTemplate" type="text/template">
<div class="terms">
Bla bla bla bla
</div>
</script>
<script id="privacyTemplate" type="text/template">
<div class="privacy">
Bla bla bla bla
</div>
</script>
<script id="aboutTemplate" type="text/template">
<div class="about">
Bla bla bla bla
</div>
</script>
你也会在termsView
的渲染函数中缺少一个冒号 render: function () {
this.$el.html(this.template());
return this;
}
答案 1 :(得分:2)
除了Rayweb_on建议的所有内容之外,请从render
,initialize
和AboutView
的{{1}}方法以及您的路线中删除对PrivacyView
的调用函数,用TermsView
等替换$('.feed').html(this.aboutView.el);
等等。
此外,在路由器中定义一个名为$('.feed').html(this.aboutView.render().el);
的变量或类似的变量,并将其设置为路由功能选择的任何视图。在每个路径功能中,检查它是否已设置,如果已设置,请在渲染新视图之前在其上调用currentView
。这些更改应使先前渲染的视图不会踩到新视图,并确保新渲染的视图是最新的。