问题
Why axios callback changes are displayed in angularjs, without using $apply
I was trying axios library on angularjs and I was surprised when I saw that the changes to $scope
in the axios callback were detected by angular. I thought I had to call $apply
like, for example, when you use setTimeout
.
// axios example
axios.get(url).then((response) => {
// Here I don\'t need $apply, why??
$scope.axiosResult = response.data;
});
// setTimeout example
setTimeout(() => {
// Here I need $apply for the timeoutResult to appear on the HTML
$scope.$apply(() => $scope.timeoutResult = {message: \"timeout!\"});
}, 2000)
Do you know why $apply
is not needed in axios?
EDIT:
A comment by georgeawg helped me see that I was using $http
on another place, so I guess the digest cycle triggered by $http
is helping axios callback to be \"digested\" too.
回答1:
How to use the axios library with AngularJS
Bring its ES6 promises into the AngularJS context using $q.when:
// axios example
̶a̶x̶i̶o̶s̶.̶g̶e̶t̶(̶u̶r̶l̶)̶.̶t̶h̶e̶n̶(̶(̶r̶e̶s̶p̶o̶n̶s̶e̶)̶ ̶=̶>̶ ̶{̶
$q.when(axios.get(url)).then((response) => {
$scope.axiosResult = response.data;
});
Only operations which are applied in the AngularJS execution context will benefit from AngularJS data-binding, exception handling, property watching, etc.
Also use the $timeout service instead of setTimeout
.
$timeout(() => {
$scope.timeoutResult = {message: "timeout!"});
}, 2000)
The $timeout service is integrated with the AngularJS framework and its digest cycle.
来源:https://stackoverflow.com/questions/46521516/how-to-use-the-axios-library-with-angularjs