$ scope变量在函数内设置时未定义

时间:2016-01-07 16:28:45

标签: angularjs angularjs-scope

我的学习应用程序中有以下示例代码。该服务完成了他的工作,并使用php生成的json代码从页面中提取了一些数据,到目前为止一直很好。

服务

(function() {
    'use strict';

    angular
        .module('app.data')
        .service('DashboardService', DashboardService);

    DashboardService.$inject = ['$http'];
    function DashboardService($http) {

        this.getFormules = getFormules;

        ////////////////

        function getFormules(onReady, onError) {
            var formJson = 'server/php/get-formules.php',
                formURL  = formJson + '?v=' + (new Date().getTime()); // Disables cash

            onError = onError || function() { alert('Failure loading menu'); };

            $http
                .get(formURL)
                .then(onReady, onError);
        }

    }
})();

然后我在我的控制器中调用getFormules函数,并将所有数据放在我的$ scope.formuleItems中,并测试一切是否成功,并且“不是...... $scope.formuleItems = undefined! - 奇怪,因为我的观点是显示数据?

控制器的一部分:

    dataLoader.getFormules(function (items){

        $scope.formuleItems = items.data;

    });

    console.log('+++++++++++++++++', $scope.formuleItems); // gives undefined

我做的第一件事就是在stackoverflow上搜索一下,看看其他人是否有同样的问题,并且有:Undefined variable inside controller function

我知道有一些解决方法,我已完成自己的研究,但有些事情告诉我,这(见下面的例子)并不是解决这个问题的最佳方法。

解决方案一:将$ watch置于控制器内

$scope.$watch('formuleItems', function(checkValue) {
   if (checkValue !== undefined) {
     //put the code in here!
  }
}

甚至:

if($scope.formuleItems != null) {}

控制器的其余部分依赖于$ scope.formuleItems。我是否真的必须将所有内容都放入$watchif?我可以用承诺解决这个问题吗?我从来没有这样做过,所以一些帮助会受到赞赏。

1 个答案:

答案 0 :(得分:1)

回调中的代码

function (items){
    $scope.formuleItems = items.data;
}

是异步评估的。这意味着你首先激活请求,然后javascript继续执行你的代码行,因此执行

console.log('+++++++++++++++++', $scope.formuleItems); // gives undefined

此时尚未调用回调,因为这需要一些时间,并且可能在任何时候发生。此操作不会停止执行。 因此,$ scope.formuleItems的值当然仍未定义。

之后 - 在未来的某个未定义的时间(可能在几毫秒之后),将调用回调并更改$ scope.formuleItems的值。您必须记录回调函数的INSIDE值。

如果你想在JavaScript中取得成功,你迫切需要理解这个概念,因为这种情况一次又一次地发生:)