2013-04-17 20 views
39

I stworzył podstawową aplikację na podstawie angularjsJak zmienić wartość opóźnienia za pomocą 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); 

Jak widać staram się zmienić val do true po 3 sekundach na 2 sposoby, ale nikt nie pracuje dla mnie. Naprawdę dziwne. Przegapiłem coś?

Właściwie próbuję zmienić wartość po otrzymaniu odpowiedzi od Ajax, ale przypuszczam, że powinien być ten sam problem.

Dzięki,

Oto mój przykład: http://jsfiddle.net/6uKAT/20/

Odpowiedz

75

Spróbuj użyć: wrapper $timeout

kątowej za window.setTimeout. Funkcja fn jest pakowana do bloku try/catch i deleguje wszystkie wyjątki do usługi 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

Dzięki, wiem, że rzeczywiście staram się zmienić wartość po dostać odpowiedź z Ajax, ale załóżmy, powinien być ten sam problem . –

+0

Aby odpowiedzieć na to konkretne pytanie, być może będę musiał zobaczyć prawdziwy przykład tego, co próbujesz osiągnąć. – Chase

+0

Powód przegłosowania? – Chase

27

Robisz zmiany zakresu poza to, co wie o kątowe (wewnątrz timeout).
Więc należy użyć $timeout .. inaczej trzeba użyć $scope.$apply()

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

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

Dla limitu czasu korzystania $timeout i będzie nazywać $scope.$apply() dla Ciebie.
Podobnie, w przypadku ajax użyć $http.

jeśli nie można z nich korzystać, trzeba zadzwonić $scope.$apply() siebie:

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

To jest poprawna odpowiedź –

+0

+1 za to, że $ stosuje się do ng-newbs jak ja, [tutaj] (http://jimhoskins.com/2012/12/17/ angularjs-and-apply.html) to świetne wyjaśnienie: – TheFuquan

Powiązane problemy