我正在使用AngularJS驱动的页面,我需要在只读输入文本字段中显示一个运行时钟(与data-ng-model绑定的双向).为了模拟正在运行的时钟,我使用带有setTimeout的
JavaScript调度程序每隔1000毫秒调用一个函数,这会更新$scope’d属性值,而该值依次绑定到该输入文本字段.不知何故,输入字段中的值没有得到更新.所以我放了一个< pre />使用jQuery选择器标记并更新其内容.这工作正常,所以我需要帮助获取输入文本字段值也每秒更新.
我为这个例子设置了一个jsFiddle.
HTML如下:
<body data-ng-app="formApp"> <div data-ng-controller="FormCtrl"> Current Date and Time <input type="text" data-ng-model="formData.currentDateTime" readonly="readonly" size="60" /> </div> <pre id="currentDateTime" style="font-size:1.5em;"> </pre> </body>
AngularJS app模块和控制器声明如下:
(function() { var formApp = angular.module("formApp",[]); formApp.controller("FormCtrl",function ($scope) { $scope.formData = {}; $scope.formData.currentDateTime = new Date().toString(); (function updateCDT() { $scope.formData.currentDateTime = new Date().toString(); document.getElementById("currentDateTime").innerHTML = $scope.formData.currentDateTime; setTimeout(updateCDT,1000); })(); }); })();
解决方法
你需要使用$scope.$apply()或angulars $timeout来反映更改,因为setTimeout超出了angularjs的范围
使用$scope.$apply()
将$scope.$apply()应用于setTimeout(function(){},1000)的匿名函数中,然后调用实际函数,如下所示
(function updateCDT() { $scope.formData.currentDateTime = new Date().toString(); document.getElementById("currentDateTime").innerHTML = $scope.formData.currentDateTime; setTimeout(function(){ $scope.$apply(); updateCDT() },1000);
fiddle for $scope.$apply()
使用$timeout(别忘了把它注入控制器)
(function updateCDT() { $scope.formData.currentDateTime = new Date().toString(); document.getElementById("currentDateTime").innerHTML = $scope.formData.currentDateTime; $timeout(updateCDT,1000); })();
fiddle为$timeout