- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
https://docs.angularjs.org/guide/directive
By listening to this event, you can remove event listeners that might cause memory leaks. Listeners registered to scopes and elements are automatically cleaned up when they are destroyed, but if you registered a listener on a service, or registered a listener on a DOM node that isn't being deleted, you'll have to clean it up yourself or you risk introducing a memory leak.
Best Practice: Directives should clean up after themselves. You can use element.on('$destroy', ...) or scope.$on('$destroy', ...) to run a clean-up function when the directive is removed.
问题:
我的指令中有一个 element.on "click", (event) ->
:
element.on
的内存引用以防止其被垃圾回收?$destroy
发出的事件上的事件监听器。我的印象是 destroy()
删除了事件监听器,事实不是这样吗?最佳答案
首先,了解有两种“事件监听器”很重要:
通过 $on
注册的范围事件监听器:
$scope.$on('anEvent', function (event, data) {
...
});
通过例如 on
或 bind
附加到元素的事件处理程序:
element.on('click', function (event) {
...
});
当执行$scope.$destroy()
时,它将删除通过该$scope上的$on
注册的所有监听器。
它不会删除 DOM 元素或任何附加的第二类事件处理程序。
这意味着从指令链接函数中的示例手动调用 $scope.$destroy()
不会删除通过例如 element.on
附加的处理程序,也不会DOM 元素本身。
请注意,remove
是一个 jqLite 方法(如果 jQuery 在 AngularjS 之前加载,则为 jQuery 方法),并且在标准 DOM 元素对象上不可用。
当执行 element.remove()
时,该元素及其所有子元素将从 DOM 中一起删除,所有事件处理程序也会通过例如 element.on
附加。
它不会破坏与该元素关联的$scope。
为了让它更加困惑,还有一个名为 $destroy
的 jQuery 事件。有时,当使用删除元素的第三方 jQuery 库时,或者如果您手动删除它们,则可能需要在发生这种情况时执行清理:
element.on('$destroy', function () {
scope.$destroy();
});
<小时/>
这取决于指令如何被“销毁”。
正常情况是指令被销毁,因为 ng-view
更改了当前 View 。发生这种情况时,ng-view
指令将销毁关联的 $scope,切断对其父范围的所有引用,并在元素上调用 remove()
。
这意味着,如果该 View 在被 ng-view
销毁时,其链接函数中包含带有 this 的指令:
scope.$on('anEvent', function () {
...
});
element.on('click', function () {
...
});
两个事件监听器都将自动删除。
但是,需要注意的是,这些监听器内的代码仍然可能导致内存泄漏,例如,如果您实现了常见的 JS 内存泄漏模式循环引用
。
即使在指令因 View 更改而被破坏的正常情况下,您也可能需要手动清理一些内容。
例如,如果您已在 $rootScope
上注册了监听器:
var unregisterFn = $rootScope.$on('anEvent', function () {});
scope.$on('$destroy', unregisterFn);
这是必需的,因为 $rootScope
在应用程序的生命周期内永远不会被销毁。
如果您使用的另一个 pub/sub 实现在 $scope 被销毁时不会自动执行必要的清理,或者您的指令将回调传递给服务,情况也是如此。
另一种情况是取消$interval
/$timeout
:
var promise = $interval(function () {}, 1000);
scope.$on('$destroy', function () {
$interval.cancel(promise);
});
如果您的指令将事件处理程序附加到当前 View 之外的元素,您还需要手动清理它们:
var windowClick = function () {
...
};
angular.element(window).on('click', windowClick);
scope.$on('$destroy', function () {
angular.element(window).off('click', windowClick);
});
这些是当指令被 Angular(例如 ng-view
或 ng-if
)“破坏”时该怎么做的一些示例。
如果您有自定义指令来管理 DOM 元素等的生命周期,它当然会变得更加复杂。
关于AngularJS - $destroy 是否删除事件监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26983696/
是否有在非 AngularJS 页面内初始化 AngularJS 应用程序的最佳实践方法?我正在向现有网页添加新功能,需要传入一个参数。具体来说,有一组选项卡,一个新选项卡将启动一个 Angular
找不到这两者之间的区别。 保留其中任何一个来引导我的 Angular 应用程序是否有意义? angular.bootstrap(document,['myApp']); 或者 angularAMD.b
我试图理解 Packpub 的书附带的示例 AngularJS 应用程序。 app.js文件在 client/src/app 下定义文件夹,它的模块定义看起来像 angular.module('app
Angularjs 具有用于表单验证和显示错误消息的强大基础设施。但是,我处于必须在特定场景中向用户显示警告消息的情况。这是我的简单表格的图表 该表单在两个字段上都应用了必需和模式验证。除了此验证之外
我在重试功能正常工作时遇到了一些麻烦,希望能获得一些帮助。我有一个要调用的$ resource,直到出现成功情况或超过最大重试次数为止。 我似乎遇到的问题是,在我的重试函数中,我正在调用另一个prom
我目前正在开发一个 AngularJS 应用程序,我遇到了以下障碍。 当用户提交时,我们有一个 login 页面,我们调用一个 web api 并对用户进行身份验证,我们目前正在使用 claims 身
当范围更新时,指令的属性不会改变,它们仍然保持初始值。我在这里缺少什么? HTML works great works: {{foo}} Javascript (基于首页上的 A
我正在使用 Zurb 的 Foundation 框架修改应用程序以实现响应性和 AngularJS。存在数据显示在带有 ... 的表中的错误有 是根据 Foundation 的响应规则隐藏/显示的。不
在过去的三天里,我一直在搜寻互联网,试图弄清楚当angular注意到div的宽度发生变化时如何使指令运行。 我不断看到相同的示例,说明如何实现此目标,但是它们对我不起作用,我也不知道为什么。 我回到一
我正在使用以下代码尝试汇总 在 Angular ,这在整个作品中,但是小于 0.5 的数字四舍五入为 0。我想 向上取整 每个数字到下一个整数。例如 0.02 应四舍五入为 1 {{((data.Vi
我目前正在尝试以一种能够适当扩展到企业级别的方式来组织我的 Angular 应用程序。但是我发现似乎过度依赖框架内的命名约定,并且试图避免命名冲突是一个真正的问题。 例如,当定义任何 constant
我正在阅读 AngularJS 基础知识,并且喜欢在我的页面中使用它的绑定(bind)功能。所以我可以定义可以在 View 中显示的数据,可以对数据进行更改,以便在 View 中更改它而无需担心。 在
在父 Controller 范围内,我定义了 selectedItem设置为“x”。然后在子范围内,我定义了selectedItem使用 ngModel:
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 5年前关闭。 Improve this questi
如果2个条件为真,我试图将一个特定的类应用于li元素,因此我编写了以下代码,但似乎无法正常工作 ng-class="{current:isActive('/'), loginStatus: false
请看看朋克。 http://plnkr.co/edit/DuTFYbLVbPkCIvRznYjG?p=preview ng-pattern regEx不适用于输入文本字段。 仅在需要验证的情况下才能正
我正在为iOS + Android构建AngularJS(1.x)和Ionic/Cordova移动应用程序。我想在登录页面上添加/创建“深层链接”,以便在我向新用户发送“确认您的电子邮件”电子邮件时,
angularjs 中服务(或工厂)的生命周期是什么,何时重新初始化? 最佳答案 当 Angular 启动时,它会将服务的构造函数附加到关联的模块上。这种情况发生一次。 angular .modu
我对 Angular 很陌生,所以希望我知道的足够多,可以问什么似乎是合理的设计问题。 我正在通过 Angular 绘制一些数据,并且正在使用 $resource。在将 Angular 引入项目之前,
我需要在我的 angular-breeze 应用程序中使用国家/地区下拉菜单,我尝试了以下操作: https://github.com/banafederico/angularjs-country-s
我是一名优秀的程序员,十分优秀!