由于某些随机原因,我创建了一个在单击时触发的指令,但是当检测到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机器(不是全部)的随机延迟,如果有人遇到过同样的问题,请
答案 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错误不会发生在这个简单的例子中,但可能会发生在更复杂的情况下)