- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我了解了无限摘要循环的基本概念以及它是如何发生的,但我遇到了问题。这是一个演示我的代码和问题的 fiddle :
在 jsfiddle 控制台中,您将看到无限摘要循环。
基本上,我必须对可能尚未加载的数据做出决定,因此我需要使用 then() 等待 promise 解决。我有一个名为用户的 promise 。在代码中有两个不同的地方我调用了用户的 then()。
对于第 2 点,可能有人会问我为什么不直接在 $scope.isAdmin() 方法中使用 $scope.user。问题是,在用户的异步请求返回之前调用 $scope.isAdmin() 是可能的,在这种情况下,我需要在从 $scope.isAdmin() 返回之前“阻止”。
我的问题是,$scope.isAdmin() 是如何让 Angular 认为“观察”变量已经改变并且摘要周期需要再次运行?
$scope.isAdmin() 实际上并没有改变任何东西。
这里是精简代码:
HTML:
<body ng-controller='myController'>
<div ng-if='isAdmin()'>Hi! <strong>{{ user.username }}</strong> is an Admin!!!</div>
<div ng-if='!isAdmin()'>Hi! <strong>{{ user.username }}</strong> is NOT an Admin!!!</div>
</body>
还有 JS:
angular.module('myApp', [])
.factory('myService', function($q, $timeout) {
return {
getUser: function() {
var deferred = $q.defer();
$timeout(function() {
deferred.resolve({ username: 'me', isAdmin: true });
}, 2000);
return deferred.promise;
}
};
})
.controller('myController', function($scope, $q, myService) {
var getUserDeferred = $q.defer();
var user = getUserDeferred.promise;
user.then(function(user) {
$scope.user = user;
return user;
});
$scope.getUser = function() {
return myService.getUser().then(function(user) {
getUserDeferred.resolve(user);
});
};
$scope.isAdmin = function() {
return user.then(function(user) {
return user.isAdmin;
});
};
$scope.getUser();
});
最佳答案
所以我终于弄清楚了我自己的问题,并认为我会为其他人回答这个问题,以防其他人发现此信息有用。
修复的关键与两个概念有关: Angular promise 和 Angular 监视。通过了解并同时应用这 2 个概念,修复实际上非常简单。
你放在 $scope 上的所有东西都被“监视”,包括函数。每次监视的内容发生变化时,$scope.$apply() 都会再次运行以应用更改。如果作用域函数(例如:$scope.isAdmin())将其返回值从一个“应用”更改为下一个,它将触发另一个“应用”,直到情况稳定且返回值不变。
但在我的代码中,我返回了 user.then(...) ,它只返回一个新的 promise (由于返回值不断变化,它使应用循环永远持续下去)。
在我的 isAdmin() 函数中,我需要将其返回值推迟到用户实际加载(任何其他返回值都将毫无意义)。因此,我更改了代码以通过检查 $scope.user 来检查用户异步调用是否已解决,如果是,则返回有效的 isAdmin 值。如果 $scope.user 仍未定义,我将返回我已经创建的 promise 。
我将 $scope.isAdmin() 更改为:
$scope.isAdmin = function() {
if ($scope.user) {
return $scope.user.isAdmin;
}
return user;
};
这与原始代码具有相同的效果,但不会触发无限应用循环。具体来说,如果 $scope.user 还没有解决,我们仍然像以前一样通过返回用户变量来返回一个 promise 。但是请注意,用户 var 是相同的 promise ,而不是 then() 创建的新 promise ,因此应用周期稳定。
为了完整起见,这里是更新的 jsfiddle:
关于javascript - 解决 $rootScope :infdig Infinite $digest Loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24650403/
如何将最初使用 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
我是一名优秀的程序员,十分优秀!