如何交换视图的模板并删除旧视图
How to swap a view's template and remove the old view
我有以下代码:
switch (type) {
case "countdown":
this.render(_this.templates.countdown);
break;
case "timer":
this.render(_this.templates.timer);
if (App.Views.timer) App.Views.timer.remove();
App.Views.timer = new Timer();
break;
}
所以,正如我所想的那样,当呈现模板时,我们将删除以前的视图,因为新 DOM 元素上的 link 已更改。但我不确定真正删除了哪些旧视图。
因为如果我在 if (App.Views.timer) App.Views.timer.remove();
之后添加 console.log(App.Views.timer)
,我会得到:child {cid: "view3", $el: jQuery.fn.init(1), el: div#timer.timer}
。而且看起来什么都没变!
我有两个问题。
- 从内存中删除视图的方法是否正确?
- 如果我有一个可以更改模板的 div,这是创建新视图的正确方法吗?不幸的是,仅隐藏模板的解决方案不适合我的情况。
视图的 remove
功能有什么作用?
View's remove
function 只是从 DOM 中删除元素,同时取消绑定任何 DOM 相关事件和 Backbone 特定事件。
Removes a view and its el
from the DOM, and calls stopListening
to
remove any bound events that the view has listenTo
'd.
code for the remove
function是:
// Remove this view by taking the element out of the DOM, and removing any
// applicable Backbone.Events listeners.
remove: function() {
this._removeElement();
this.stopListening();
return this;
},
关于记忆中的景色
所以它仍然存在于内存中,直到您释放任何剩余的引用。将视图对象记录到控制台使其保持活动状态,因为它是对它的引用。
分享一个 div 多视图
我不会同意你的做法。您可以将 Backbone Router 与路由一起使用,然后为自己制作某种布局视图,而不是开关盒。
一个超级简单的布局视图可能如下所示:
var LayoutView = Backbone.View.extend({
initialize: function() {
// caching the jQuery object on init
this.$content = this.$('#content');
},
setContent: function(view) {
var content = this.content;
if (content) content.remove();
content = this.content = view;
this.$content.html(content.render().el);
},
});
在路由器中使用:
var Router = Backbone.Router.extend({
routes: {
'about': 'aboutRoute',
'contact': 'contactRoute',
// put the catch-all last
'*home': 'homeRoute',
},
initialize: function() {
// create the layout once here
this.layout = new views.Application({
el: 'body',
});
},
homeRoute: function() {
var view = new views.Home();
this.layout.setContent(view);
},
aboutRoute: function() {
var view = new views.About();
this.layout.setContent(view);
},
contactRoute: function() {
var view = new views.Contact();
this.layout.setContent(view);
}
});
我在上写了一个详细的答案。
我有以下代码:
switch (type) {
case "countdown":
this.render(_this.templates.countdown);
break;
case "timer":
this.render(_this.templates.timer);
if (App.Views.timer) App.Views.timer.remove();
App.Views.timer = new Timer();
break;
}
所以,正如我所想的那样,当呈现模板时,我们将删除以前的视图,因为新 DOM 元素上的 link 已更改。但我不确定真正删除了哪些旧视图。
因为如果我在 if (App.Views.timer) App.Views.timer.remove();
之后添加 console.log(App.Views.timer)
,我会得到:child {cid: "view3", $el: jQuery.fn.init(1), el: div#timer.timer}
。而且看起来什么都没变!
我有两个问题。
- 从内存中删除视图的方法是否正确?
- 如果我有一个可以更改模板的 div,这是创建新视图的正确方法吗?不幸的是,仅隐藏模板的解决方案不适合我的情况。
视图的 remove
功能有什么作用?
View's remove
function 只是从 DOM 中删除元素,同时取消绑定任何 DOM 相关事件和 Backbone 特定事件。
Removes a view and its
el
from the DOM, and callsstopListening
to remove any bound events that the view haslistenTo
'd.
code for the remove
function是:
// Remove this view by taking the element out of the DOM, and removing any // applicable Backbone.Events listeners. remove: function() { this._removeElement(); this.stopListening(); return this; },
关于记忆中的景色
所以它仍然存在于内存中,直到您释放任何剩余的引用。将视图对象记录到控制台使其保持活动状态,因为它是对它的引用。
分享一个 div 多视图
我不会同意你的做法。您可以将 Backbone Router 与路由一起使用,然后为自己制作某种布局视图,而不是开关盒。
一个超级简单的布局视图可能如下所示:
var LayoutView = Backbone.View.extend({
initialize: function() {
// caching the jQuery object on init
this.$content = this.$('#content');
},
setContent: function(view) {
var content = this.content;
if (content) content.remove();
content = this.content = view;
this.$content.html(content.render().el);
},
});
在路由器中使用:
var Router = Backbone.Router.extend({
routes: {
'about': 'aboutRoute',
'contact': 'contactRoute',
// put the catch-all last
'*home': 'homeRoute',
},
initialize: function() {
// create the layout once here
this.layout = new views.Application({
el: 'body',
});
},
homeRoute: function() {
var view = new views.Home();
this.layout.setContent(view);
},
aboutRoute: function() {
var view = new views.About();
this.layout.setContent(view);
},
contactRoute: function() {
var view = new views.Contact();
this.layout.setContent(view);
}
});
我在