- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
以下必须是Angular.js开发人员必须在某些时候进行故障排除的最常见错误。
Error: $apply already in progress
$scope.$apply
调用,将其删除即可解决此问题。在其他时候,可能需要它,因此开发人员采用以下模式。
if(!$scope.$$phase) {
$scope.$apply();
}
$scope.$$phase
循环或调用
return
时,为什么Angular不会不做任何事情就只检查
$digest
和
$scope.$apply
,而不是抱怨并且
引发错误,因此很难隐式地跟踪。
$$phase
的方法的入口点检查
$digest
本身,从而使消费者不必麻烦吗?
$scope.$apply
调用,这有什么含义吗?
$$phase
不检查默认值,而不检查奇数?
$$phase
升级到
1.2.1
,并且在页面加载时会抛出该异常,所以我不知道它的起源。因此,问题是,为什么我们甚至不得不追踪这种晦涩的bug,却不知道在代码中寻找该bug的原因?
最佳答案
如果收到此错误,则说明您在wrong place中使用了$scope.$apply()
。我认为此错误的原因如下:如果在错误的位置调用$apply
,则可能无法完全理解其存在的原因,并且可能错过了实际应调用的位置。
如果允许这样的失误悄无声息地发生(例如,始终先测试$scope.$$phase
),这将鼓励草率使用,并且人们可能会在“$apply
覆盖率”方面遇到漏洞。与该错误消息相比,这种错误(在 View 中未反射(reflect)$scope
的更改)要难得多,您应该可以通过检查堆栈跟踪来调试该错误消息(请参见下文)。
为什么$apply
存在?$apply
的目的是实现$scope
和view之间自动的双向数据绑定(bind),这是Angular的主要功能之一。此功能要求所有可能包含$scope
修改的代码(因此,基本上每条用户代码)都在调用堆栈中的$apply
调用下运行。正确地执行此操作实际上并不那么复杂,但是我认为documented并不是很好。
主要的“问题”是Javascript可以具有任意数量的 Activity 调用堆栈,并且Angular不会自动收到有关新调用堆栈的通知。每当触发异步回调时(例如,单击,超时,文件访问,网络响应等),都会创建一个新的调用堆栈。想要在这样的回调函数中修改$scope
是很常见的。如果相应的事件由Angular本身提供,那么一切都会正常进行。但是有时您会想要订阅“外部事件”。 Google Maps事件,例如:
function Controller($scope) {
$scope.coordinates = [];
//...
var map = new google.maps.Map(mapElement, mapOptions);
google.maps.event.addDomListener(map, 'dblclick', function (mouseEvent) {
$scope.coordinates.push(mouseEvent.latLng);
});
}
http://jsfiddle.net/mhelvens/XLPY9/1/
$scope.coordinates
”调用堆栈添加到
$apply
的。换句话说,Angular不了解Google Maps事件。
$apply
?
$scope.$apply()
通知Angular事件:
function Controller($scope) {
//...
google.maps.event.addDomListener(map, 'dblclick', function (mouseEvent) {
$scope.$apply(function () {
$scope.coordinates.push(mouseEvent.latLng);
});
});
}
http://jsfiddle.net/mhelvens/XLPY9/2/
$apply already in progress
”错误表明您未遵循此规则。如果您必须经常处理Google Maps事件,则可以将此示例代码包装在服务中:app.factory('onGoogleMapsEvent', function ($rootScope) {
return function (element, event, callback) {
google.maps.event.addDomListener(element, event, function (e) {
$rootScope.$apply(function () { callback(e); });
});
};
});
function Controller($scope, onGoogleMapsEvent) {
//...
onGoogleMapsEvent(map, 'dblclick', function (mouseEvent) {
$scope.coordinates.push(mouseEvent.latLng);
});
}
http://jsfiddle.net/mhelvens/XLPY9/3/ onGoogleMapsEvent
事件现在可以识别Angular了,如果可以的话,也可以称为“内部事件”(顺便说一句,我完全是在编造这些术语)。这使您的代码更具可读性,并让您在日常编程中忘记了$apply
;只需调用包装器而不是原始事件订阅者即可。$timeout
服务为例。$apply already in progress
”错误$apply
:onGoogleMapsEvent(map, 'dblclick', function (mouseEvent) {
$scope.$apply(function () { // Error: $apply already in progress
$scope.coordinates.push(mouseEvent.latLng);
});
});
http://jsfiddle.net/mhelvens/XLPY9/4/ $apply
调用不遵循我们的放置规则(毕竟onGoogleMapsEvent
事件不是外部事件;我们授予它们“内部”权限)。如果双击 map ,您会看到错误和堆栈跟踪信息出现在日志中:Error: [$rootScope:inprog] $apply already in progress
...
at Scope.$apply (.../angular.js:11675:11)
at http://fiddle.jshell.net/mhelvens/XLPY9/4/show/:50:16
...
at Scope.$apply (.../angular.js:11676:23)
at dl.ondblclick (http://fiddle.jshell.net/mhelvens/XLPY9/4/show/:33:24)
...
我只留下了相关的行:引用Scope.$apply
的行。收到此错误消息时,应该始终在堆栈上找到两个Scope.$apply
调用(或Scope.$digest
调用,它们具有相似的功能; $digest
由$apply
调用)。$apply
调用”。但是在其他情况下,您可能会发现位于堆栈下方的调用的位置也不正确。$apply
时才会出现错误。但是,如果Angular可以做到这一点,则无需首先手动调用该函数。
关于javascript - Angular为什么不忽略随后的$ digest调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20805534/
如何将最初使用 Digest::MD5.digest('abc') 编码的哈希字符串转换为以下格式的十六进制字符串 Digest::MD5.hexdigest(' abc')?不同之处在于,十六进制字
我正在尝试制作一个应用程序,用户可以在其中将音乐上传、下载和流式传输到 Amazon Web Services、Simple Storage Services (AWS-S3)。 我试图解决的一个问题
每当我运行测试或启动 Rails 服务器时,我都会收到此警告。 当我从 .rvm 文件夹运行 grep 时,我看到以下内容: grep -R 'Digest::Digest' . ./rubies/r
我收到以下错误 Digest::Digest is deprecated; use Digest 当我尝试启动我的 Rails 服务器时。我试图在我的源代码中搜索 Digest::Digest 但我没
我在解决这个问题时遇到了一些麻烦。我正在尝试编写一个通用函数,它可以接受任何 digest::Digest并吐出计算摘要的字符串形式(“十六进制字符串”)。 这是the non-generic ver
当我尝试使用我的应用程序启动 Tomcat6 时(我正在尝试从 Tomcat7 移植到 Tomcat6),我遇到了一个奇怪的解析问题。 Digester 本身不会声明错误,直到遇到意外的文件结尾 -
使用 Digest::SHA 有什么优势吗?超过Digest::SHA1或相反亦然?两者似乎都得到了维护,但我不认为 Digest::SHA1 与 Digest::SHA 一起存在的原因。 最佳答案
例如。当我用每个函数计算哈希时,我得到不同的结果。 PKI::PKI.digest("hola", "MD5") digest::digest("hola", "md5") 最佳答案 对摘要使用ser
在 AngularJS 范围内,$apply() 在每个事件处理程序(输入指令的 keydown/input 事件,选择指令的更改事件等)和其他一些情况下被调用。 见 small example .尽
我将从这个 XML/RDF 中提取值: Church of S. Giuda Taddeo or S. Onofrio - Gaeta Chiesa S. Giuda Taddeo
我得到java.lang.NoClassDefFoundError: org/apache/commons/digester/Digester 错误,我被这个错误困扰了一个多月。我已经尝试了所有可用的
我正在为客户提供一个片段,以粘贴到他们引用我的 application.js 文件的静态 html 中。 因为它位于我无法控制的页面上,而且我不想在每次发布时都要求客户更新他们的代码片段,所以我想知道
我正在尝试在 Linux 中使用 curl 更改基于 Onvif 的相机的日期。我已经在 c# 中成功完成并使用摘要身份验证,但我被困在这种情况下。 我正在使用以下命令: curl -u "admin
我正在尝试通过 Eclipse ide 生成 jasper 报告,但是当我执行以下代码行时: jasperReport = JasperCompileManager.compileReport("re
我目前正在学习 Michael Hardtl 的 Rails 教程,在第 7 章中有一段以 require 'digest' 开头的代码。 .我跑sudo gem install digest并得到无
我有一个 perl 脚本,它使用 Digest::MD5 md5($data) 来获取 16 字节摘要(以不可读的形式 - 二进制),并且该摘要用于加密数据。现在我必须在 java 中反转上述过程,即
我使用 $http.get() 获取数据并将其作为参数传递给自定义过滤器以获取过滤数据。但它正在给予错误:$digest 已在进行中。 有谁知道如何避免此错误或以不同的方式实现相同的目标? var m
除了以纯文本形式发送凭据之外,摘要式身份验证与基本身份验证有何不同? 最佳答案 主要区别在于它不需要以明文方式通过网络发送用户名和密码。它也不受重放攻击的影响,因为它使用来自服务器的一次性号码。 服务
在签名的 apk 中,会有一个 META-INF/MANIFEST.MF 文件。在这个文件中,我们可以找到像这样的摘要: Name: res/layout/main.xml SHA1-Digest:
我是这个论坛的新手。乍一看,这个社区看起来棒极了。我有一个简单的问题。我正在使用 log4j 进行记录并且是 tomcat 的新手。我找到了设置日志规则的文件,文件名:server.log4j-con
我是一名优秀的程序员,十分优秀!