2014-02-25 31 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

相关问题