【发布时间】:2014-08-15 00:49:40
【问题描述】:
我的 Backbone 应用有 2 个页面。第 1 页使用集合上的fetch() 方法来获取数据。
当我导航到第 2 页,然后返回到第 1 页时,我可以看到 fetch() 数据被记录了两次。每次我离开新页面时,fetch 调用都会向上递增,然后返回到第一页。
这是僵尸视图吗?我该如何阻止这种情况发生?
这是我使用 Backbone 的 JavaScript:
var MyModel = Backbone.Model.extend({
defaults: {
'id': 'null',
'color': '',
'date': '',
'name': ''
}
});
var MyCollection = Backbone.Collection.extend({
model: MyModel,
url: 'https://api.mongolab.com/api/1/databases/testdatabase/collections/Content?apiKey=xxxxxxxxxxxxxxx'
});
var aCollection = new MyCollection();
var MyViewOne = Backbone.View.extend({
el: '.js-container',
initialize: function () {
this.collection = aCollection;
this.listenTo(this.collection, 'sync', this.render);
this.collection.fetch();
},
template: _.template( $('#One').html() ),
render: function () {
console.log('render One');
console.log(this.collection);
this.$el.html( this.template({collection: this.collection}) );
return this;
}
});
var MyViewTwo = Backbone.View.extend({
el: '.js-container',
template: _.template( $('#Two').html() ),
render: function () {
console.log('render Two');
this.$el.html( this.template() );
return this;
}
});
var MyRouter = Backbone.Router.extend({
routes: {
'': 'pageOne',
'pageone': 'pageOne',
'pagetwo': 'pageTwo'
},
pageOne: function () {
var myViewOne = new MyViewOne();
},
pageTwo: function () {
var myViewTwo = new MyViewTwo();
myViewTwo.render();
}
});
var myRouter = new MyRouter();
Backbone.history.start();
这是我的 HTML:
<div>
<ul class="nav">
<li>
<a href="#pageone">Page One</a>
</li>
<li>
<a href="#pagetwo">Page Two</a>
</li>
</ul>
</div>
<div class="js-container">
</div>
<script type="text/template" id="One">
Color = <%- collection.models[0].attributes.color %>
</script>
<script type="text/template" id="Two">
Click the link "Page One" and check the console to see the fetch call for the collection incrementing.
</script>
【问题讨论】:
-
您每次访问页面时都会创建一个新视图,而无需清理旧视图。我不清楚的是您所看到的情况多次发生。每个视图实例都将监听集合上的“同步”事件并调用渲染作为响应,只有在视图实例化(初始化)时才会调用 fetch,所以当你说你看到“fetch”时我不确定你的意思' 发生多次。
-
@kinakuta 我认为它正在发生,因为我没有清理视图,而且我不太确定如何继续:清理视图。有一个
console.log(this.collection),这是我每次离开PageOne'并返回'PageOne'时看到的多次记录
标签: javascript jquery backbone.js