2013-04-17 61 views
39

我創建了基本的應用程序基於angularjs如何通過使用angularjs來改變延遲後的值?

HTML:

<div ng-app="miniapp"> 
<div ng-controller="Ctrl"> 
    My name is 
    <input type="text"/> 
    Val: {{val}} 
    <br/> 
    <button ng-disabled="val">Submit</button>   
</div>  

JS:

var app = angular.module('miniapp', []); 

var glob; 
function Ctrl($scope) {  
    glob = $scope;  
    $scope.val = false; 

    window.setTimeout(function() { 
      $scope.val = true; 
     }, 3000);    
} 

window.setTimeout(function() { 
      glob.val = true; 
     }, 3000); 

正如你可以看到我嘗試改變valtrue通過2種方式3秒後,但沒有人爲我工作。真奇怪。我錯過了什麼?

其實我試圖從Ajax獲取響應後更改值,但假設應該是同樣的問題。

感謝,

這是我的例子:http://jsfiddle.net/6uKAT/20/

回答

75

嘗試使用:$timeout

角的包裝爲window.setTimeout。 fn函數將 封裝到try/catch塊中,並將任何異常委託給 $ exceptionHandler服務。

$timeout(fn[, delay][, invokeApply]);

Updated Fiddle

的JavaScript

var app = angular.module('miniapp', []); 

function Ctrl($scope, $timeout) { 
    $scope.val = false; 
    $timeout(function(){$scope.val = true}, 3000);  
} 
+0

謝謝,我知道,其實我試圖改變價值得到Ajax響應後,但假設應該是同樣的問題。 –

+0

爲了回答這個特定的問題,我可能需要看到你想要完成的一個真實例子。 – Chase

+0

downvote的原因? – Chase

27

你是什麼樣的角度知道外面做(超時內)的變化範圍。
所以,你應該用$timeout ..否則,您必須使用$scope.$apply()

$timeout(function() { 
    $scope.val = true; 
}, 3000); 

http://jsfiddle.net/6uKAT/21/

對於超時使用$timeout,它會調用$scope.$apply()你。
同樣,對於阿賈克斯使用$http

,如果你不能使用這些,那麼你就必須調用$scope.$apply()自己:

window.setTimeout(function() { 
    $scope.$apply(function() { 
     $scope.val = true; 
    }); 
}, 3000); 
+1

這是正確的答案 –

+0

+1提到$申請ng-newbs像我的自我,[here](http://jimhoskins.com/2012/12/17/ angularjs-and-apply.html)是一個很好的解釋: – TheFuquan