2013-04-29 37 views
2

鑑於以下AngularJS控制器:

function PhoneListCtrl($scope, $http) { 
    $scope.phones = {};  

    $http.get('phones/phones.json').success(function(data) { 
     $scope.phones = data.splice(0, 5); 
    }); 

    $scope.orderProp = 'age'; 
} 

使用的代碼(從角官方教程),這已結合的phones模型將被更新,以反映所接收到的JSON響應的模板。但是,如果您纏繞$範圍更新在setTimeout聲明如下:

function PhoneListCtrl($scope, $http) { 
    $scope.phones = {};  

    $http.get('phones/phones.json').success(function(data) { 
    setTimeout(
     function(){ 
      $scope.phones = data.splice(0, 5); 
     }, 
     5000 
    ); 
    }); 

    $scope.orderProp = 'age'; 
} 

模板將不會更新,角碼似乎沒有拿起這種情況下,模型的變化。

我的問題很明顯:爲什麼它不能在第二種情況下工作?在$ http回調中,角色運行時如何通知模型更改?

+0

這不起作用,因爲setTimeout不知道角度範圍的任何內容,因爲它是在角度範圍外執行的,如果你想讓你的代碼工作,你必須使用範圍$ apply以下由joakimbl回答 – 2013-04-29 11:42:56

回答

4

當您使用setTimeout時,您在角框架之外執行回調函數(即使它沒有延遲)。如果你想在這個函數中角度變化,你必須使用$scope.$apply通知角 - 這樣的:

setTimeout(
    function(){ 
    $scope.$apply(function(){ 
     $scope.phones = data.splice(0, 5); 
    } 
    },5000); 

如果你要使用的setTimeout你應該看看$timout service

+0

它純粹是一個理解角度的問題,謝謝你的回答! – Asciiom 2013-04-29 11:52:58