除非我滚动,否则指令不会在点击事件中触发DOM中的输出更改

时间:2017-02-06 14:28:47

标签: javascript angularjs

由于某些随机原因,我创建了一个在单击时触发的指令,但是当检测到click事件时,除非我在页面上滚动,否则指令不会执行,否则指令不会自动触发。 此错误仅发生在Windows上,而不是发生在Mac上。 两者都适用于相同版本的Chrome(55)

这是一个简单指令的示例,只有在滚动

之后才会触发窗口
app.directive("myDirective", function(){
    return{
        restrict: "A",
        link: function(scope, element, attrs){
            element.click(function(){
                alert("clicked");
            })
        }
    }
})

请不要评论它是语法错误,因为我不熟悉stackoverflow代码版本,代码在mac和其他机器上运行良好。我只是遇到一些Windows机器(不是全部)的随机延迟,如果有人遇到过同样的问题,请

1 个答案:

答案 0 :(得分:0)

如果在指令中使用非角度事件,则需要告知Angular其摘要应用周期的变化。在您的情况下,滚动似乎会触发一个新事件,而角度将应用之前点击事件中所做的更改,这些更改未被应用,因为它不知道。

解决此问题的最简单方法是使用scope.$apply,它会告诉angular将您的更改应用于其模型(因此,DOM)

app.directive("myDirective", function(){
    return{
        restrict: "A",
        link: function(scope, element, attrs){
            element.click(function(){
                scope.$apply(function() {
                    alert("clicked");
                });
            });
        }
  }
})

如果您正在进行申请,如果您致电申请,有时可能会给您一个错误(inprogr)。我建议您使用$timeout服务,该服务将尽快安全地应用更改(在当前申请结束后)

app.directive("myDirective", ['$timeout', function($timeout){
  return {
    restrict: "A",
    link: function(scope, element, attrs){
      element.click(function(){
        $timeout(function() {
          alert("clicked");
        });
      });
    }
  }
}])

有关此主题的更多信息:https://docs.angularjs.org/error/$rootScope/inprog

这是一个显示问题的傻瓜:http://plnkr.co/edit/QGSlbK?p=preview(inprog错误不会发生在这个简单的例子中,但可能会发生在更复杂的情况下)