2014-02-25 54 views
0

我有以下簡單的控制器在我的角度應用

vehicleSearchApp.controller('VehicleSearchCtrl', function ($scope, $location){ 

    $scope.location = $location; 
    $scope.$watch('location.search()', function() { 
     $scope.target = ($location.search()).target; 
    }, true); 

    $scope.changeTarget = function(name) { 
     $location.search('target', name); 
    } 

    console.log($scope.target); 
    console.log($scope); 

} 

向控制器的底部的第一個控制檯日誌語句返回不確定的,但第二個控制檯日誌語句返回一個對象,如下所示:

enter image description here

我看到'target'屬性以及此對象中的其他方法/屬性。如果我嘗試使用「console.log($ scope.target)」進行打印,爲什麼我會在控制檯中收到「未定義」消息?

回答

3

可能是一個計時問題。在$ watch語句觸發之前,您無需設置$ scope.target即可。它很可能是在它登錄到控制檯時設置的,並且當它到達第一個日誌時擴展它,而不是它。

+0

如果我將console.log($ scope.target)語句移到console.log($ scope)語句之後,我會得到同樣的結果。 console.log($ scope.target)語句是控制器中的最後一行。在這種情況下,我如何訪問我的控制器中的變量? –

+0

它是異步設置$ scope.target的值,所以它不會在你移動它的那個塊的哪個位置。如果將console.log($ scope.target)移動到$ watch中的$ scope.target =之後,您將看到它的值已記錄。所以你確實可以訪問它,但是它在你記錄它的地方沒有價值。當你console.log($ scope)時,你記錄了一個對實際對象的引用(當時不是它的快照),所以當你在控制檯中看到它時,就是在異步調用$ watch之後。 –

0

這是一個計時問題:您看到undefined,因爲當代碼到達log聲明時,$scope.target尚不可用。

您可以在Chrome瀏覽器上安裝batarang插件來檢查$scope元素的值。

+0

我有點困惑,我真的只是試圖將URL中傳入的值(在本例中爲$ scope.target變量)綁定到我的控制器中的另一個對象。如果是時間問題,這會如何影響我綁定變量的能力?我已經嘗試在控制器的最後放置console.log語句,並仍然在控制檯中獲得相同的未定義消息。 –

+0

你可以很好地綁定它。如果您將{{target}}放入您的html模板中,它將在$ scope.target可用時立即顯示它的值。 –

+0

@MattPileggi是對的,你可以在你的'HTML'模板中使用它,AngularJS會在它變成可用時顯示它的所有魔術 – Atropo

相關問題