AngularJS - $ scope在同一个控制器中未定义

时间:2015-06-15 00:14:28

标签: angularjs angularjs-scope

我有一个控制器,我试图在$ scope.weather中存储信息,然后使用它的内容传递给一个函数。当我在使用一个函数时记录$ scope.weather [0] .latitude的结果,但是当我在同一个控制器中调用另一个函数时,结果将返回undefined。 $ scope不能在同一个控制器中使用吗?这也属于同一个功能。

angular.module('CityCtrl', []).controller('CityController', ['$scope', '$http', 'City', function($scope,  $http,  City){

$scope.update = function (zip) {
    City.get({zip : zip}).success(function(response){
        $scope.weather = response
    }).then(function(response){
        $scope.weather = response.data;

        // This is returning the expected result
        console.log($scope.weather[0].latitude;
    })

    if(zip.length === 5){

        // This is coming back undefined
        console.log($scope.weather[0].latitude);

        var box = getBoundingBox([$scope.weather[0].latitude, $scope.weather[0].longitude], 50);

        City.matches(box[1], box[3], box[0], box[2]).success(function(response){
            $scope.matches = response
        }).then(function(response){
            $scope.matches = response.data;
            console.log($scope.matches);
        })

    }
}
}]);

1 个答案:

答案 0 :(得分:1)

这是一个操作顺序问题。

if语句console.log($scope.weather[0].latitude)中的$scope.weather实际上尚未设置,因为City.get()调用是异步的。这意味着在City服务返回成功响应之前不会设置$scope.weather,在您的情况下将在if语句中的代码块之后执行。

为了使您的if语句代码能够访问$scope.weather,您需要将其包含在代码的.then(function() { // if logic here }部分中。

值得注意的是,City.get().success()City.get().then(successFunction)几乎都在做同样的事情。你应该使用其中一个,但你不应该同时使用它们。