使用鼠标事件时,调用angularjs中的window.alert()会导致错误。

5

这是代码链接:

http://plnkr.co/edit/usrmiNkj5YJY5SlV8ETw?p=preview

打开javascript控制台并点击“say hi”,会触发一个错误,提示$apply正在进行中。

但是当你移除如下代码:

ng-controller="mouseEvents" ng-mousedown="onMouseDown()" ng-mouseup="onMouseUp()" ng-mousemove="onMouseMove()"

保存后,当您点击“say hi”时,错误消失了。

我该如何解决这个问题?

我需要使用mouseEvents为多个控制器设置标志,以判断鼠标是否按下或松开。在我的代码中,我不能简单地将其删除。

编辑:

更新的Angular版本 解决了我的问题,无需$timeout v1.3.10或更高版本。


我在控制台中没有看到任何错误信息,无论是在Chrome(27)还是在FF(32)中。 - t.niese
你的原始代码中也使用了alert吗?http://plnkr.co/edit/sLdVSX?p=preview - PSL
@PSL 是的,你看到错误信息了吗? - Ismail
@t.niese 我正在使用 Chrome 版本 37,并禁用了所有扩展程序。我可以看到它,你能否尝试使用 Chrome 版本 37?截图:http://prntscr.com/4kmg4w - Ismail
@Ismail 抱歉,我写成了27而不是37。 - t.niese
1个回答

8
使用 $timeout 让 Angular 完成脏检查,然后再显示警告。
app.controller("demoController",function($scope,$window, $timeout){
  $scope.save = function(){
    $timeout(function(){
       window.alert("hi!");
    });

  };
}); 

Plunkr: http://plnkr.co/edit/Kxbey5Rc43xsB9v5ugZ5?p=preview

它起作用了!你能给一个链接或更深入地解释一下为什么它起作用以及我为什么会出错吗?在使用$timeout之前,你也看到错误了吗? - Ismail
我认为每次想要使用window.alert()时都使用$timeout不是一个好的做法。 - Ismail
这是因为您在单击时触发了movedown/up事件。每当警报框显示时,浏览器会停止JavaScript的进一步执行,直到用户响应,如果正在进行角度脏检查,则会出现错误。我假设您不想在生产中显示警报,那么就不需要$timeout。 - pankaj
1
在调试时使用console.log代替window.alert。这不需要$timeout,也是一个好的实践方法。 - pankaj
这不是为了调试目的,我将在生产中使用它。一定有某种解决方案或者其他人遇到过相同的问题。 - Ismail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接