2013-04-17 6 views
39

私はangularjsanglejsを使用して遅延後の値を変更する方法はありますか?

HTMLに基づいて基本的なアプリケーションを作成しました:あなたは、私がにvalを変更しようと見ることができるように

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); 

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

JS3秒後に2つの方法で誰も私のために働いていません。本当に奇妙です。私は何か見落としてますか?

実際、私はAjaxからの応答を得た後に値を変更しようとしますが、同じ問題があるはずです。 http://jsfiddle.net/6uKAT/20/

答えて

75

を使用してみてください:window.setTimeoutは用$timeout

角度のラッパー

おかげで、

はここに私の例です。 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

おかげで、私は、実際に私が後にアヤックスからの応答を取得した値を変更しようとしていることを知っているが、同じ問題であるべきと仮定します。あなたはこれらを使用できない場合

、あなたは$scope.$apply()を自分で呼び出す必要があります。 –

+0

その特定の質問に答えるために、あなたが達成しようとしているものの本当の例を見る必要があるかもしれません。 – Chase

+0

downvoteの理由は? – Chase

27

あなたは、角程度(タイムアウト内)を知っているものの外範囲に変更を加えています。
だから、そう、あなたがタイムアウトのために$scope.$apply()

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

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

$timeoutを使用使用する必要があります。.. $timeoutを使用する必要があり、それはあなたのために$scope.$apply()を呼び出します。
同様に、ajaxでは$httpを使用します。

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

関連する問題