当前位置: 首页 > 面试题库 >

如何安全清除指令中的AngularJS事件绑定

谷梁玺
2023-03-14
问题内容

我有一个Angular指令,该指令将元素的高度设置为等于浏览器窗口的内部高度(+/-给定的偏移量)。该指令响应窗口的“调整大小”事件,并相应地调整其高度。当指令的作用域发出’$
destory’事件时,我将删除对“ resize”事件的绑定(我认为将其留在原地会引起一些问题,如果我错了,请纠正我)。

我不知道如何以“安全”的方式执行此事件分离。如果我在整个应用程序中都有该指令的多个实例,又如果我有其他附加到’resize’事件的指令怎么办?

JQuery具有事件名称空间的概念,这似乎是一个很好的解决方案,但是Angular的实现(JQLite)不支持此方法。我宁愿不使用JQuery,因为我已经在使用Angular,那么该怎么办?

这是我今天的指令的代码

window.angular.module('arcFillClient', [])
    .directive('arcFillClientY', ['$window',
        function ($window) {

            function link($scope, el, attrs) {

                var setHeight,
                    onResize,
                    cleanUp;

                setHeight = function (offSetY) {
                    var newHeight;
                    offSetY = offSetY || 0;
                    newHeight = Math.max($window.innerHeight + parseInt(offSetY, 10)) + 'px';
                    el.height(newHeight);
                };

                onResize = function () {
                    var offset;
                    offset = attrs.arcFillClientY || 0;
                    setHeight(offset);
                };

                attrs.$observe('arcFillClientY', setHeight);
                window.angular.element($window).on('resize', onResize);

                cleanUp = function () {
                    window.angular.element($window).off('resize');
                };

                $scope.$on('$destroy', cleanUp);
            }
            return {
                link: link
            };

UPDATE
看起来像RTFM的情况,但以防万一其他人在这里徘徊,这里有一些更多信息。将原始函数(以我的情况为例OnResize)传递给.off()工作以隔离.off()函数的范围。从文档:

还可以通过在处理程序参数中指定函数名称来删除处理程序。当jQuery {ahem …
JQLite}附加事件处理程序时,它将为处理程序函数分配一个唯一的ID。

这是cleanUp我指令中的更新函数:

cleanUp = function () {
    window.angular.element($window).off('resize', onResize);
};

感谢tasseKATT,Karolis和Hans的贡献。


问题答案:

通过同样的功能引用off,你传递给on

window.angular.element($window).off('resize', onResize);

代替:

window.angular.element($window).off('resize');

演示-将功能引用传递给off
:http :
//plnkr.co/edit/1rfVPNXl6TrEcuYvzPAj?p=preview

演示-未将html" target="_blank">功能引用传递给off
:http://plnkr.co/edit/IsLqSLAzNcHqDnhMty7Q?p
= preview

演示包含两个指令,它们均侦听窗口调整大小事件。在代码和预览之间使用垂直分隔符触发事件。

您会注意到,如果将一个函数销毁为off,则销毁另一个函数将继续工作。如果您不这样做,两者都将停止工作。



 类似资料:
  • 本文向大家介绍Angularjs中使用指令绑定点击事件的方法,包括了Angularjs中使用指令绑定点击事件的方法的使用技巧和注意事项,需要的朋友参考一下 项目中,模板中的菜单是jQuery控制的,在Angularjs中就运行不到了,因为菜单项是ng-repeat之后的。 如html Jquery给第一级a链接绑定事件代码像: 因为我之前看过文档说,Angularjs的Controller不处理D

  • 本文向大家介绍Angularjs 动态添加指令并绑定事件的方法,包括了Angularjs 动态添加指令并绑定事件的方法的使用技巧和注意事项,需要的朋友参考一下 这两天学习了angularjs 感觉指令这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记。 先说使用场景,动态生成DOM元素并绑定事件,非常常见的一种场景,用jq实现效果: 如果用angularjs应该怎么实现呢?想当然的情况是这

  • 问题内容: 我一直在尝试定义指令,以便可以根据字段的类型及其参数(存储在数据库中)以表格形式显示不同的“窗口小部件”。我需要对不同类型的场景做出反应,因此需要使用指令来处理布局。 在玩一些示例时,我想出了 kinda 可以工作的代码: HTML 指示 这似乎可行(尽管明显比* proper * angularJS变量绑定要慢),但我认为必须有更好的方法来做到这一点。谁能阐明这件事? 问题答案: 我

  • 问题内容: 我已经看到人们从他们的代码中的任何地方执行此操作: 然后在某些控制器中: 现在,我想广播指令中的事件。在rootScope级别广播它是一种好习惯吗?我想在控制器中处理此事件。我可以使用$ scope还是仍然必须在$ rootScope上收听? 问题答案: 就我而言,我只想将指令中的事件广播到使用该指令的视图控制器。那么使用广播仍然有意义吗? 我会让指令在控制器上调用方法,该方法在使用指

  • 问题内容: 我将Spring + Hibernate用于需要创建和更新数十万个项目的操作。像这样: 为了防止自己丢失中间的更改,我会在之后立即提交更改: 在这一点上,我不得不说整个过程都在包装成的事务中运行(是的,这是一个webapp)。 这一切都很好,但有一个例外:经过数千次更新/提交后,整个过程确实变慢了,这很可能是由于Spring / Hibernate保存的对象数量不断增加而导致内存膨胀。

  • 问题内容: 我正在制作一个演示,其中我将使用固定时间间隔从服务器上获取数据,现在我需要停止/取消此操作。 我该如何实现?如果需要重新启动该过程,该怎么办? 其次,我还有一个问题:经过规定的时间间隔后,我正在从服务器获取数据。有需要使用还是? 这是我的朋克: http://plnkr.co/edit/ly43m5?p=preview 问题答案: 您可以存储间隔返回的承诺并用于该承诺,这将取消该承诺的