.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请求在发送响应之前需要一个小时的时间。
- 服务将返回
{}
。 - 在控制器中,
this.obj
将被设置为{}
。 - 在视图中,
notesCtrl.obj.notes
将是undefined
,因此ng-repeat
不会发生。 - 一小时后,当响应返回时…它会更新该对象。服务指向它,控制器指向它,视图也指向它。因此它们都被“更新”了(实际上是对象被更新了;指针没有改变,所以它们并没有真正被“更新”)。
- 响应触发
.success
的回调函数,进行更新,一旦.success
的回调函数完成,就会启动一个digest循环。 - digest循环看到
notesCtrl.obj
已经改变,因此运行相应的回调函数,更新DOM。
这样正确吗?
另外,$http
触发$digest
还是$apply
?如果它触发$digest
,那么它如何知道在哪个$scope
上调用它?例如,服务中的$http
与$scope
无关(是吗?)。