2013-10-09 44 views
0

看看我的小提琴。 http://jsfiddle.net/tyF7q/如果你使用setTimeout,angularjs奇怪的數據綁定行爲

也有一些是我不與angular.js的數據綁定明白:

如果你點擊「addSomething」多次,「TEST3」出現在每一次點擊。
現在,如果您點擊「addSomething2」,則什麼都不會顯示,甚至直到2009ms。
但是,如果你點擊「addSomething」,「test4」也會出現,但只有當你點擊2009ms後,否則「test4」也不會出現。
此外,如果您點擊「addSomething2」,並在2009年後你點擊「addSomething2」一個「test4」出現。

這只是一個簡單的例子,它出現在我使用的socket.io 並且有一些socket.on()事件綁定。 在這種情況下,我的「addSomething2」ng-click綁定將是socket.on('addSomething2'),但結果仍然相同。

因爲我是在angularjs新,我沒有看到我在這裏做錯了。

HTML:

<div ng-app> 
    <div id="edit" ng-controller="Edit"> 
     <a href="" ng-click="addSomething()">addSomething </a><br> 
     <a href="" ng-click="addSomething2()"> addSomething2</a> 
     <div ng-repeat="doneMsgs in doneSoFar"> 
      {{doneMsgs.status}}:{{doneMsgs.info}} <br> 
     </div> 
    </div> 

    </div> 

JS:

功能編輯($範圍){

$scope.doneSoFar = []; 
$scope.doneSoFar.push({status:"test",info:"test"}) 
var doneSoFarPush = function(status,info){ 
    $scope.doneSoFar.push({status: status,info:info }); 
}; 
doneSoFarPush('test2','test2'); 

$scope.addSomething = function() { 
    doneSoFarPush('test3','test3'); 
}; 

$scope.addSomething2 = function() { 
    setTimeout(function(){ 
    doneSoFarPush('test4','test4'); 
    },2009); 
}; 
}; 
+1

嘗試'$ timeout'服務,而不是:http://docs.angularjs.org/api/ng.$timeout –

+0

您是否嘗試過使用'$ timeout'服務由Angular提供? – DotDotDot

回答

4

您需要直接使用,而不是setTimeout$timeout服務。這將允許角度管理$digest週期。否則,你將不得不自己管理$apply

Here is an updated fiddle

和更新的代碼:

function Edit($scope, $timeout) { 


    $scope.doneSoFar = []; 
    $scope.doneSoFar.push({status:"test",info:"test"}) 
    var doneSoFarPush = function(status,info){ 
     $scope.doneSoFar.push({status: status,info:info }); 
    }; 
    doneSoFarPush('test2','test2'); 

    $scope.addSomething = function() { 
     doneSoFarPush('test3','test3'); 
    }; 

    $scope.addSomething2 = function() { 
     $timeout(function(){ 
     doneSoFarPush('test4','test4'); 
     },2009); 
    }; 
};