2015-01-12 27 views
0

有人可以解釋爲什麼spinerChange()函數無法正常工作嗎? http://jsfiddle.net/HB7LU/9907/當我啓動函數時,ng-show不會改變

<div ng-controller="naujienosControler"> 
<button type="button" ng-click="spinerButtonChange()">Click Me!</button> 
<div class="spinner" ng-show="spiner" > 
    <div class="cube1"></div> 
    <div class="cube2"></div> 
</div> 
</div> 


var myApp = angular.module('myApp',[]); 
myApp.controller('naujienosControler', function ($scope) { 

var status = true; 
$scope.spiner = status; 
$scope.spinerButtonChange = function(){$scope.spiner = !$scope.spiner;};  
function spinerChange(){ 

setTimeout(function(){ alert("Why spiner dont disapear?????????"); $scope.spiner = false;},  3000); 
console.log($scope.spiner); 

}; 

spinerChange(); 
}); 
+0

檢查這個問題,以及「https://coderwall.com/p/udpmtq/angularjs-use-timeout-not-settimeout」 – squiroid

回答

2

進樣和使用$timeout另一種選擇,因爲你想要的角度進行digest你做你的行動之後。

myApp.controller('naujienosControler', function ($scope, $timeout){ 
    $timeout(function(){ $scope.spiner = false; }, 3000}); 
} 

編輯(感謝lechariotdor):它總是用「angularjs世界」包裝一個很好的做法,因爲它們運行的​​$apply方法,執行你的範圍和「同步」與發生變化的模型digest

+1

我想補充一點,這是一個角度的最佳實踐在存在的時候使用Angular的'wrappers'($ timeout,$ window,$ document,...),所以可以避免這樣的奇怪事情。 – tiledcode

+0

@lechariotdor - 我已添加該信息..謝謝。 –

1

因爲JavaScript setTimeout是未在angularjs範圍觸發事件,所以角不知道的範圍之外變化。

有一種方法可以實現的是如下使用$timeout代替setTimeout,這裏是DOC for $timeout

$timeout(function() { 
    $scope.spiner = !$scope.spiner; 
}, 3000) 

,不要忘記到控制器注入$timeout

myApp.controller('naujienosControler', function ($scope, $timeout) {.... 

這裏是the update


存在使用$scope.$appy()here is a good tutorial about $apply()

function spinerChange(){  
    setTimeout(function(){ 
     $scope.spiner = !$scope.spiner; 
     $scope.$apply();  
    }, 3000); 
    };  
    spinerChange(); 
}); 

OR

function spinerChange(){  
    setTimeout(function(){   
     $scope.$apply(function() { 
      $scope.spiner = !$scope.spiner; 
     });  
    }, 3000); 
    };  
    spinerChange(); 
}); 
0

用途: -

$timeout(function(){ alert("Why spiner dont disapear?????????"); $scope.spiner = false;}, 500); 
相關問題