gpt4 book ai didi

backbone.js - Backbone.View 和 Backbone.Model 实例过多

转载 作者:行者123 更新时间:2023-12-01 04:04:13 28 4
gpt4 key购买 nike

我有一个主 View 负责呈现其他 View ......
这是完整的代码 (1) (2) (3)。

当我第一次加载 View (View1、View2、View3)时,一切正常。
然后,如果我尝试重新加载 View ,显然更改 this.options 似乎没问题..
但是我注意到有一些僵尸 View ……,
我的意思是内存中先前 View 的实例。
我使用这种代码的和平发现了这一点......

View1 = Backbone.View.extend({
initialize: function ()
{
this.model.on('change', function () {
console.log(this.cid);
}, this);
}
});

望向 cid我发现每次重新加载 View 时都会出现新 View
生成不同的 cid 并留在内存中..
例子
** first load **:
console.log(this.cid); // cid:12

** Second load **
console.log(this.cid); // cid:12
console.log(this.cid); // cid:13

等等...

我的设计有什么问题?我该如何解决?

(1)入口点
require([
"js/mainApp"
], function(App){
App.initialize(data.id);
});

(2)主应用程序
define([
"js/views/taskDetailView"
], function (TaskDetailView) {

var initialize = function(task_id){

var vent;

vent = _.extend({}, Backbone.Events); // The Event Aggregator

var taskDetailView = new TaskDetailView({
task_id: task_id,
vent: vent
});

$(".project-content").html(taskDetailView.$el);
}

return {
initialize: initialize
};
});

(3)
define([
"js/views/view1",
"js/views/view2",
"js/views/view3",
"text!templates/Task/TaskDetailedView.html"
], function (View1, View2, View3, taskDetailedViewTemplate) {

var TaskDetailView = Backbone.View.extend({

el: $(".project-content"),

initialize: function ()
{
this.render();
},

render: function ()
{
var options;
// render from template and assign this.el to the root of the element
// e.g .project-content
this.setElement($(Mustache.render(taskDetailedViewTemplate)));
this.view1 = new View1(_.extend( {el:this.$("#taskView")} , this.options));
this.view2 = new View2(_.extend( {el:this.$("#feedView")} , this.options));
this.view3 = new View3(_.extend( {el:this.$("#followerView")} , this.options));
}
});

return TaskDetailView;
});

最佳答案

您是否忘记从 DOM 中实际删除 View

http://documentcloud.github.com/backbone/#View-remove

仅将另一个 View 分配给同一元素不会删除前一个 View (多个 View 可以引用同一元素)。

编辑 :

您可能想在重新分配 View 之前尝试检查它们是否存在

    render: function ()
{
var options;
// render from template and assign this.el to the root of the element
// e.g .project-content

if (this.view1 != null) {
this.view1.remove();
}

//the rest of your code

编辑 2 :

我不知道你的 mainApp 是如何被第二次调用的,但也许你可能想尝试让它保持对 TaskDetailsView 的引用

一种尝试方法是在分配新的 TaskDetailsView 之前清理现有的
 if (this._taskDetailsView != null) { 
this._taskDetailsView.cleanUp().remove();
}

var taskDetailView = new TaskDetailView({
task_id: task_id,
vent: vent
});
this._taskDetailsView = taskDetailView;

更好的方法可能只是刷新 View 的必要部分
define([
"js/views/taskDetailView"
], function (TaskDetailView) {

var _taskDetailView;
var initialize = function(task_id){

var vent;

vent = _.extend({}, Backbone.Events); // The Event Aggregator

if (this._taskDetailsView == null) {
var taskDetailView = new TaskDetailView({
task_id: task_id,
vent: vent
});
this._taskDetailsView = taskDetailView;
} else {
this._taskDetailsView.refresh({task_id: task_id,
vent: vent
});

}
$(".project-content").html(taskDetailView.$el);
}

return {
initialize: initialize
};
});

关于backbone.js - Backbone.View 和 Backbone.Model 实例过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10654278/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com