$http在什么时候触发摘要循环开始
At what point does $http trigger the digest cycle to start?
我的假设是,它发生在.success
回调完成执行之后。与相反
- 在
.success
回调完成运行之前 - 请求发出后立即发送
考虑这个代码:
notes.service.js
angular.module('notes').service('notes', ['$http',
function($http) {
var obj = {};
this.getNotes = function() {
$http.get('/notes').success(function(notesResponse) {
obj.notes = notesResponse;
});
return obj;
};
}]);
notes.controller.js
angular.module('notes').controller('NotesCtrl', ['notes',
function(notes) {
/*
$scope.$$watchers = [
'notesCtrl.obj', cb
];
*/
this.obj = notes.getNotes();
}]);
list.html
<div class='page-header'>
<h1>List of Notes</h1>
</div>
<ul>
<li ng-repeat='note in notesCtrl.obj.notes track by note.id'>{{note | json}}</li>
</ul>
想象一下,GET请求需要一个小时才能发送回响应。
- 该服务将发回CCD_ 3
- 在控制器中,
this.obj
将被设置为{}
- 在视图中,
notesCtrl.obj.notes
将是undefined
,因此不会发生ng-repeat
- 一个小时后,当回复回来时。。。它会更新该对象。服务指向它,控制器指向它,视图指向它。所以它们都被"更新"了(实际上是对象被更新了;指针不会改变,所以它们并没有真正被"更新")
- 响应触发
.success
的回调,后者进行更新,一旦.success
的回调完成,就会启动摘要循环 - 摘要循环看到
notesCtrl.obj
发生了变化,因此运行相应的回调,从而更新DOM
这是正确的吗?
此外,$http
触发$digest
还是$apply
?如果它触发$digest
,它如何知道调用哪个$scope
?例如,服务中的$http
与$scope
没有关联(是吗?)。
这是最正确的:在摘要周期中,成功回调实际上被称为。如果你尝试以下,你可以看到这一点
$http.get('test.json').success(function(result) {
$scope.$apply();
});
然后(假设GET到test.json
成功),Angular将抛出一个可以在控制台中看到的错误:
Error: [$rootScope:inprog] $digest already in progress
这可以在http://plnkr.co/edit/wj4z1hDRXtK2GJnrkKuV?p=preview
另外,$http触发$digest还是$apply?
$apply
,因为它确实不知道需要检查哪些作用域,所以它触发一个全局摘要来检查所有作用域。
我查看了$http的文档(行:1083)在下方找到这条线
/**
*回调已注册到$httpBackend():
*-根据需要缓存响应
*-解析原始$http承诺
*-调用$apply
*/
它说回调被注册到$httpBackend(),如果需要,它会按照缓存响应的顺序执行以下操作(取决于你在$http中提供true,它会缓存它)。然后它根据响应解析$httppromise,这意味着调用成功或错误(也可以是Then())。然后它最终调用$apply来执行摘要循环。
据我从文档中了解到,$http服务绑定了$rootScope。
如果你在想,如果$apply在它之后启动,那么文档本身$rootScope中就是答案$始终运行的applySync并解析httppromise,然后在此$rootScope之后解析$apply()运行。(线路:1102-1106)
希望这能消除你的疑虑。
- 希望日期开始结束于while循环中的一个房间id的一个数组
- For 循环从错误的数字开始
- $http在什么时候触发摘要循环开始
- Vanilla Js:在一个事件中开始一段时间的循环,然后用第二个事件打破它?('mouseover'启
- for循环,直到xml属性不为null.从最后一行开始javascript
- 当我尝试在循环中使用.push时,它似乎比间隔数提前一个阶段开始,这似乎会导致溢出
- 如何在从不同索引开始的数组中循环,同时仍然在整个数组中循环
- 如何使用事件处理程序连续循环遍历数组列表(从结束恢复到开始)
- 当 JavaScript 循环插入 HAML 部件时,服务器是否会在循环完成之前开始渲染部件
- 运行 for 循环.递增值;退出并使用新值再次开始循环
- 用于循环画布绘图的 Javascript - 返回开始 x 和 y
- 只有在查看完所有图像后,在图库中循环才开始淡入/淡出图像
- Angular:循环并显示从ng中的特定$index开始的所有值
- Javascript,setInterval在while循环之后开始?如何使它在while循环内部启动
- 当鼠标悬停在元素上时,如何停止/开始循环滑块
- 功率功能.为什么在循环开始时将结果设置为1
- 如何在CoffeeScript的内部开始求值中使用外部索引嵌套循环
- 在开始一个将循环自身的函数之前延迟6秒,小,不工作,为什么
- 第一个循环在第二个循环开始时停止
- 如何让我的循环开始从一开始错误检测后