在 Backbone.js 中实例化子视图时如何避免内存泄漏

2023-12-01

myView =  Backbone.View.extend({
    //event binding etc etc

    render: function() {
        //render some DOM
    }
})

anotherView = Backbone.View.extend({
    events: {
        'click .selector doThis'
    },

    createNewView: function() {
        var view = new myView();
    }
})

createNewView可能会被调用多次。我的理解是变量view不一定会被 JavaScript 的内置垃圾回收删除,因为它引用的对象/代码在createNewView功能完成。

它是否正确?这该如何处理呢?

我目前的方法是初始化myView一旦在我的应用程序级别:

myApp.view = new myView()

Then in createNewView我只是调用渲染:

myApp.view.render()

本质上,我只拥有其中之一,并且会重复使用它。

另一种方法是跟踪数组中子视图的创建,然后我调用.remove()当我知道不再需要它们时,依次对每一个进行处理。

我走在正确的轨道上吗?

我认为第二种方法更好,因为如果myView在其他对象上创建绑定回调listenTo,这些不会简单地通过重新分配变量来删除。也就是说,如果我打电话new要实例化视图的新实例,我应该调用remove()首先是关于被丢弃的实例......看来。


在您的示例中,您没有将视图的el进入 DOM,因此没有任何内容引用该视图,那么它将被垃圾收集器收集。

确保视图不再绑定到某些东西的一件好事是call .remove() on it。它将删除:

  • 观点el从 DOM 中,
  • jQuery DOM 事件
  • Backbone 事件监听器。

骨干.remove source:

// 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;
},

// Remove this view's element from the document and all event listeners
// attached to it. Exposed for subclasses using an alternative DOM
// manipulation API.
_removeElement: function() {
    this.$el.remove();
},

正如所提到的mu 太短了在评论中(以及我自己在几乎所有其他答案中),你应该始终favor listenTo over on or bind以避免内存泄漏并简化解除绑定事件。

渲染嵌套在父视图中的子视图时,一个好的做法是保留子视图的数组以供以后调用.remove()在他们每个人身上。

一个简单的列表视图可能如下所示:

var ListView = Backbone.View.extend({
    initialize: function() {
        // Make an array available to keep all the child views
        this.childViews = [];
    },
    addOne: function(model) {
        var view = new Backbone.View({ model: model });

        // as you create new views, keep a reference into the array.
        this.childViews.push(view);

        this.$el.append(view.render().el);
    },

    renderList: function() {
        // replace the view content completely with the template
        this.$el.html(this.templates());

        // then cleanup
        this.cleanup();

        // then render child views
        this.collection.each(this.addOne, this);

        return this;
    },

    cleanup: function() {
        // quick way to call remove on all views of an array
        _.invoke(this.childViews, 'remove');
        // empty the array
        this.childViews = [];
    },
});

尽管如果其他对象正在监听它,它不会被收集并且可能是泄漏。跟踪引用并在不再需要时将其全部删除非常重要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Backbone.js 中实例化子视图时如何避免内存泄漏 的相关文章

  • 禁用内容安全策略

    当我开发网站时 我经常想看看特定功能在网站上的外观如何 所以我会使用 chrome 开发者工具并经常运行一些 javascript 脚本 我经常发现一些脚本由于内容安全策略 CSP 而无法运行的问题 我完全理解该策略是为了防止跨站点脚本攻击
  • 如何将udp发送到udp node.js服务器?

    我对此很陌生 所以我真的不知道我在做什么 但我已经设置了一个 node js udp 服务器 我想从客户端 来自网站 向它发送一个数据包 但我不知道如何在 javascript 中做到这一点 或者是否可能 我不是在研究如何从 Node js
  • 如何更改传单中功能集的样式?

    我正在看等值区域的例子 https leafletjs com examples choropleth https leafletjs com examples choropleth 这是他们使用的数据源 type Feature prop
  • 动态速度计 javascript 或 jquery 插件

    我希望有动态ajax插件在页面上显示速度计 一个想法是我设置一个背景并旋转针 有人知道相关插件吗 这里有一些供您参考 http bernii github com gauge js http bernii github com gauge
  • jQuery 选择 # id 以单词为前缀,计数器为后缀

    有没有办法用 jQuery 选择所有带有前缀 my 和后缀 0 9 的 id 像这样的 my 1 4 还是可以用循环来实现 div div div div div div div div div div 第一个想法 似乎效果很好 div i
  • 如何按照编写的顺序迭代 javascript 对象属性

    我发现了代码中的一个错误 我希望通过最少的重构工作来解决该错误 此错误发生在 Chrome 和 Opera 浏览器中 问题 var obj 23 AA 12 BB iterating through obj s properties for
  • 如何仅在 NextJS 站点构建期间使用 getInitialProps?

    当使用 NextJS 构建静态站点时 我想要getInitialProps方法仅在构建步骤期间触发 而不是在客户端上触发 在构建步骤中 NextJS 运行getInitialProps 方法 https nextjs org docs fe
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • Ember.js 处理 View 事件后转换到路由

    Setup 我有一个 Ember 应用程序 支持使用 Imgur API 上传图像 我已经有一个工作路线和模板来处理任何 Imgur ID 但我想在上传新图像后转换到此路线 使用返回的 Imgur ID 这是该应用程序的相关部分 http
  • Leaflet js虚构地图

    我是 Leaflet 的新手 我想了解如何创建完全交互式的虚构地图 我有一张图像想要转换为传单地图 该图像基本上像图表一样具有许多连接和点 我想首先将该图像转换为地图 能够将鼠标悬停在这些点上 突出显示它们并显示有关它们的信息 并且还可以在
  • 如何流式传输 OpenAI 的完成 API?

    我想流式传输结果通过 OpenAI 的 API 完成 https beta openai com docs api reference completions 该文档提到使用服务器发送的事件 https developer mozilla
  • 类型“typeof import("/home/kartik/Desktop/Ecommerce/ecommerce/node_modules/firebase/index")”上不存在属性“auth”。 TS(2339)

    我是 FireBase 的初学者 我正在尝试使用 Angular 通过 FireBase 实现 Google 登录 我在 auth 时收到上述错误 我特此附上login component ts和package json package l
  • Select2 下拉列表动态添加、删除和刷新项目

    这让我发疯 为什么 Select2 不能在其页面上实现清晰的方法或示例如何在 Select2 上进行简单的 CRUD 操作 我有一个 select2 从 ajax 调用获取数据
  • Nodejs mysql 获取正确的时间戳格式

    我在用着mysqljs https github com mysqljs mysql得到结果后sql我变得不同TimeStamp格式如下 created at Sat Jul 16 2016 23 52 54 GMT 0430 IRDT 但
  • 如何获取 UIWebView 中元素的位置?

    我在 iPad 程序中加载了 html 的 UIWebView 通过使用 webkit column width 我将 html 分为几列 padding 0px height 1024px webkit column gap 0px we
  • 如何在 javascript 正则表达式中匹配平衡分隔符?

    我原以为这个问题是不可能的 据我所知 Javascript 的正则表达式既没有递归插值 也没有漂亮的 NET 平衡组功能 但问题就在那里 如问题 12 所示正则表达式 alf nu http regex alf nu 匹配平衡对 lt an
  • 需要有关 React Js 的帮助

    我是 React Js 新手 我的代码无法正常工作 请看下面 这是我的脚本文件Main jsx 该文件由 React 编译 输出放置在 dist 文件夹下的 main js 文件中 var react require react react
  • 使用异步调用时如何从 javascript 更新元刷新?

    我有一个系统 它使用元刷新来注销页面 该系统会在空闲用户后进行清理 不用担心 服务器也会导致会话超时 我开始通过 ajax 进行一些操作 不是真正的 xml 但这不是重点 我可以运行从异步请求返回的javascript 所以我想知道是否可以
  • KeyboardAvoidingView - 隐藏键盘时重置高度

    我正在使用 React NativeKeyboardAvoidingView设置我的高度View当显示键盘时 但是当我关闭应用程序中的键盘时 视图的高度不会变回原来的值
  • 单击列表时使用 bootstrap Dropdown 防止下拉菜单消失

    我正在使用使用引导下拉菜单 http twitter github com bootstrap javascript html dropdowns生成下拉菜单 我想防止点击菜单时菜单消失 我已经实现了以下代码 但它不起作用 知道如何修复它吗

随机推荐

  • Chrome 中 上 之间的悬停状态丢失

    我试图通过当用户将鼠标悬停在行上时更改行的背景颜色来实现简单的表行悬停效果 这很简单 tr hover background red 但是我注意到 Chrome 中的一个错误 其中一行中的单元格之间有一个很小的空间 我丢失了 hover和
  • 从android中的edittext框获取XXX-XXX-XXXX格式的电话号码

    你好 我正在编写一个 android 其中用户在编辑文本框中输入电话号码 我希望数字采用 xxx xxx xxxx 的形式 这意味着在用户输入前 3 个字母和另一个 后 应自动出现 I used EditText anum EditText
  • Java:如何注册侦听 JFrame 运动的侦听器

    如何跟踪 JFrame 本身的移动 我想注册一个每次都会被回调的监听器JFrame getLocation 将返回一个新值 EDIT这是一个代码 显示接受的答案正在解决我的问题 import javax swing public class
  • 使用通配符 SSL 证书通过 HTTPS 进行 WCF

    我们是在线浏览器内管理工具的开发人员 我们的主要软件目前通过互联网托管并可供客户访问 每个客户都有自己的主要软件实例和子域 例如 customerA ourdomain com 定向到在虚拟服务器上运行的客户 A 的服务 customerB
  • 使用正弦或余弦函数的 C/C++ 3D 烟花效果

    I am trying to implement fireworks effect in C I have a cube with dimensions 10x10x10 A rocket starts from the ground an
  • 从预先训练的 NASnet 网络进行迁移学习。如何知道要冻结的层数?

    为了训练图像分类模型 使用 Keras 或 Tensorflow 我想使用我自己的图像数据集重新训练 NASNetMobile 的一定数量的层 在本文中 https arxiv org pdf 1707 07012 pdf A 7 节 我们
  • MS SQL 上的字符串连接用于一组行

    假设我有 2 张桌子 1 与用户 另一个记录哪些用户使用了哪些代码 Users Id Name 1 John 2 Doe Codes Id UserId code 1 1 145 2 1 187 3 2 251 现在我想提取一个查询 结果如
  • 从 uploadify jquery 插件获取文件名

    这是我的第一篇文章 我在这里尝试获取上传文件的名称 以便用户可以根据需要删除它 就像雅虎一样 uploadifysub1 uploadify uploader JS uploadify swf script JS uploadify php
  • .Net 连接池 MySQL 临时表

    我们有一个在 NET MVC Web 应用程序中使用的 MySQL 数据库 我们实施连接池 因为它具有一些巨大的性能优势 我们还在一些关键存储过程中完成了一些相当繁重的处理 他们创建几个临时表和用户变量 这些临时表和用户变量在连接的生命周期
  • gganimate 根据时间对多条路径进行动画处理

    我解析了电子游戏 反恐精英 中有关手榴弹投掷的一些数据 下面的示例数据显示我有关于手榴弹从哪里投掷 手榴弹爆炸的位置以及何时投掷手榴弹的位置 df lt data frame pos x c 443 6699994744587 459 45
  • 您可以根据范围创建分组吗? [复制]

    这个问题在这里已经有答案了 这与另一个问题 我认为这确实解决了一个更简单的问题 所以我在这里问更简单的问题 希望它能帮助我解决更复杂的问题 我希望能够在 linq to sql 查询中创建一个分组 该分组基于另一组数据中的一系列数据 不过
  • 连接到 Hive 时出错。Error:java.sql.SQLException: 找不到适用于 jdbc:hive2 的驱动程序:

    您好 我正在尝试从 Nodejs 连接到 hive 我用了https www npmjs com package jdbc安装 JDBC 我收到以下错误 错误 运行静态方法 java sql SQLException 时出错 没有合适的 找
  • 如何将谷歌字体连接到页面?

    我已经使用了 Google Fonts 中关于如何设置字体的建议 所以我做了以下动作 1 在页面添加此依赖 2 将CSS设置为body标签 html body font family Roboto sans serif background
  • Python/Scapy:仅嗅探传入数据包

    我可以在 Scapy 中仅嗅探传入数据包或仅嗅探传出数据包吗 无需在数据包字段上添加过滤器 简短的回答 不 Scapy 的嗅探功能不区分传入和传出的数据包 如果你想根据源mac进行过滤 你可以这样做 MYMAC 12 34 56 78 90
  • 如何创建每个点有两种颜色的散点图?

    我正在尝试绘制两个地面实况 and my在 matplotlib 中同时分类 目前 我只在应用后绘制真实情况tsne在特征空间上并使用以下代码添加边缘 from matplotlib collections import LineColle
  • 多维矩阵(/数组)的矩阵乘法 - 如何避免循环?

    我正在尝试使用包含要相乘的多个矩阵的数组来评估矩阵乘法 这可以通过使用 np dot 或 Py3 5 中的新 运算符 的两个矩阵轻松实现 但我正在努力扩展它以有效地评估我的多维数组 举个例子 假设我有形状为 5 3 3 的矩阵 A 和形状为
  • 样式表 HTML 定义中的 media="" 属性指的是什么?

    相信有些人已经看过以下内容 或者其他什么 但媒体属性实际上有什么作用呢 我创建了几个网站 但在链接样式表时从未使用过媒体属性 这是一个错误吗 谢谢 阿米特 w3可以最好地解释它 媒体类型与用于查看页面的媒体有关 如果有人正在打印该页面 pr
  • Cortex-A57可以双发出128位neon指令吗?

    Cortex A57 优化指南指出 大多数对 128 位向量数据进行操作的整数指令都可以双发出 第 24 页 整数基本 F0 F1 逻辑 F0 F1 执行吞吐量 2 然而 根据我们的内部 综合 基准测试 即使有大量可用的指令并行性 吞吐量似
  • C# 枚举到 postgres 枚举

    我目前正在使用 postgres 枚举 CREATE TYPE http action enum AS ENUM GET HEAD POST PUT DELETE CONNECT OPTIONS TRACE PATCH CREATE TAB
  • 在 Backbone.js 中实例化子视图时如何避免内存泄漏

    myView Backbone View extend event binding etc etc render function render some DOM anotherView Backbone View extend event