我是棱角分明的新人。我正在阅读$scope.$apply();
的功能
我得到了一个样本,其中控制器的数据成员值是从计时器分配的,但更改没有反映在UI中,但是当我使用$scope.$apply();
然后更改反映到UI .........为什么?
我在我的控制器中定义了计时器,所以如果我将任何数据分配给控制器的数据成员,那么应该进行更改。告诉我计时器有什么问题,如果我们将任何数据分配给控制器的数据成员,那么更改不会进入UI。
<div ng-app="myApp" ng-controller="FirstCtrl">
{{message}}
<br>
<button ng-click="myFunc()">OK</button>
</div>
var myApp = angular.module('myApp', []);
myApp.controller('FirstCtrl', function( $scope ){
$scope.message = "Waiting 2000ms for update";
setTimeout(function () {
$scope.message = "Timeout called!";
// AngularJS unaware of update to $scope
alert("alert called");
$scope.$apply();
}, 2000);
$scope.myFunc = function() {
$scope.message = "Timeout called!";
};
});
答案 0 :(得分:1)
setTimeout
是javascript函数。它导致摘要周期停止运行。这就是您需要使用$scope.$apply()
手动启动摘要周期的原因。
或者,您可以使用$timeout
服务代替setTimeout
。 $timeout
在构建服务中是有角度的,因此它不会对摘要周期造成任何问题
$timeout(function () {
$scope.message = "Timeout called!";
// AngularJS unaware of update to $scope
alert("alert called");
$scope.$apply();
}, 2000);
确保将$timeout
注入您的控制器
答案 1 :(得分:1)
AngularJS为此提供了一个方便的包装:$timeout()
- 它为我们$apply()
打电话,所以我们不必这样做。魔术!
查看强>
<div ng-app="app" ng-controller="MainController as vm">
{{vm.message}}
<br>
<button ng-click="vm.myFunc()">OK</button>
</div>
<强> CONTROLLER 强>
angular
.module('app', [])
.controller('MainController', MainController)
function MainController($timeout) {
var vm = this;
vm.myFunc = myFunc;
vm.message = "Waiting 2000ms for update";
function myFunc() {
vm.message = "Timeout called!";
}
$timeout(myFunc, 2000);
}
答案 2 :(得分:1)
使用角度的$timeout
服务,而非原生javascript settimeout
var myApp = angular.module('myApp', []);
myApp.controller('FirstCtrl', function($scope, $timeout) {
$scope.message = "Waiting 2000ms for update";
$timeout(function() {
$scope.message = "Timeout called!";
// AngularJS unaware of update to $scope
alert("alert called");
//$scope.$apply();
}, 2000);
$scope.myFunc = function() {
$scope.message = "Timeout called!";
};
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="FirstCtrl">
{{message}}
<br>
<button ng-click="myFunc()">OK</button>
</div>
&#13;
答案 3 :(得分:-1)
在您的应用中使用 $ timeout 服务,其中包含自动 $ apply()。这应该可以解决您的问题。