AngularJS изменяет обычный поток JavaScript, предоставляя собственный цикл обработки событий. Это разбивает JavaScript на классический и AngularJS контекст выполнения. Только операции, которые применяются в контексте выполнения AngularJS, выиграют от привязки данных AngularJS, обработки исключений, отслеживания свойств и т. Д.
Когда контроллер обновляет область, изменение не сразу распространяется на свойство ввода value
. Сначала в цикле событий браузера AngularJS необходимо обновить атрибут value
ввода. Затем в цикле событий браузера необходимо обновить свойство value
на основе нового атрибута value
.
app.controller("ctrl",function($scope,$timeout) {
$scope.premiumVal = "75";
elem = document.getElementById("my-hidden");
console.log("scope",$scope.premiumVal);
console.log("attr.value",elem.attributes.value);
console.log("elem.value",elem.value);
$scope.$evalAsync(function() {
//THESE ARE EXECUTED ON NEXT AngularJS framework tick
console.log("$evalAsync attr",elem.attributes.value);
console.log("$evalAsync elem",elem.value);
})
$timeout(function() {
//THESE ARE EXECUTED ON NEXT browser tick
console.log("$timeout attr",elem.attributes.value);
console.log("$timeout elem",elem.value);
})
})
Функция $ evalAsync задерживает оператор console.log
, позволяя циклу событий AngularJS обновить атрибут value
.
Функции $ timeout задерживают оператор console.log
, позволяя циклу событий браузера обновлять элемент value
.
Любой код, который должен использовать новые значения, должен быть соответствующим образом задержан.
Для получения дополнительной информации см.
angular.module("app",[])
.controller("ctrl",function($scope,$timeout) {
$scope.premiumVal = "75";
elem = document.getElementById("my-hidden");
console.log("scope",$scope.premiumVal); //scope 75
//console.log("attr.value",elem.attributes.value);
console.log("elem.value",elem.value); //elem.value {{premiumVal}}
$scope.$evalAsync(function() {
//console.log("$evalAsync attr",elem.attributes.value);
console.log("$evalAsync elem",elem.value); //$evalAsync elem {{premiumVal}}
})
$timeout(function() {
//console.log("$timeout attr",elem.attributes.value);
console.log("$timeout elem",elem.value); //$timeout elem 75
})
})
<script src="//unpkg.com/angular/angular.js"></script>
<body ng-app="app" ng-controller="ctrl">
<input id="my-hidden" type="hidden" name="premium"
value={{premiumVal}}>
<br>
<h1>{{premiumVal}}</h1>
</body>