【问题标题】:Angular ng-if holds reference to DOM elementAngular ng-if 持有对 DOM 元素的引用
【发布时间】:2015-01-16 04:29:34
【问题描述】:

在 AngularJS 项目中,我们有一个 video 元素,当用户点击 Space 时,它需要在播放和暂停之间切换。这可能是一个有点幼稚的实现,但在一个指令中,我们已将处理程序连接到$document click 事件以切换视频。它看起来像这样:

var video = element.find('video')[0];
$document.on('keypress', function(evt){
    if(evt.which === 32) {
       // toggle video 
       video[video.paused ? 'play' : 'pause']();
    }
});

到目前为止,这已按预期工作。唯一的问题是该指令使用ng-if 指令隐藏或显示,但即​​使在ng-if 表达式计算为false 之后,文档点击处理程序仍保留视频引用。当我们仍然听到视频播放时,我们发现了这一点,即使它不再在 DOM 中。

我创建了一个Plnkr Example 来演示这个问题。视频在 2.5 秒后消失,但您会注意到,即使在 ng-if 将其从 DOM 中删除后,您也可以按 Space 切换视频状态。

对于答案,我正在寻找:

1) 一种更好的,也许是“更 Angular”的方法来解决这个问题。

2) 一种检测视频不再位于 DOM 上的方法,因此可以删除引用。

谢谢!

【问题讨论】:

    标签: javascript angularjs html5-video


    【解决方案1】:

    角度方式是将其添加到链接函数中:

    scope.$on("$destroy", function () {
      $document.off('keypress');
    });
    

    这是任何指令事件绑定的好习惯。最终(据我所知)垃圾收集器将通过并清除这些事件,但是如果您在 ng-repeat.... 中的项目上进行事件,那么您可能会发生内存泄漏。

    【讨论】:

    • 这也是我的想法,但视频似乎仍然“存在”。尝试添加具有启动/暂停视频功能的$interval - 它将继续播放/停止。如果这不是OP的问题,那么这个答案绝对是正确的。
    • This plunker 显示console.log(evt); 在按下空格键时没有任何动作。
    • 我添加了 $interval 服务(我什至忘记了,哈哈)
    • 哇哦,这就是我要找的东西!谢谢你的回答!
    猜你喜欢
    • 2018-02-27
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 2015-03-29
    • 2020-07-10
    相关资源
    最近更新 更多