Javascript AngularJS:函数内的变量$scope在函数外似乎未定义

Javascript AngularJS:函数内的变量$scope在函数外似乎未定义,javascript,angularjs,inheritance,angularjs-scope,Javascript,Angularjs,Inheritance,Angularjs Scope,我是AngularJS的新手,我被困住了:\需要帮助,请 下面代码的目的是从数据库中获取特定数据(整数),以便构建圆环图。 我运行函数dataforGraphs()以获得该值。但是,在函数之外,我“释放”了这个值 (在代码期间,我发表了一些评论,以便更好地解释情况) 我已经尝试返回$scope.ammontOfficedOrders,但仍然没有返回任何内容。这可能是作用域继承的问题吗?如果是,我应该怎么做才能解决这个问题?如果没有。。。不管怎样,还是帮帮我吧:D 非常感谢 您正在AJAX调用(异

我是AngularJS的新手,我被困住了:\需要帮助,请

下面代码的目的是从数据库中获取特定数据(整数),以便构建圆环图。 我运行函数dataforGraphs()以获得该值。但是,在函数之外,我“释放”了这个值

(在代码期间,我发表了一些评论,以便更好地解释情况)

我已经尝试返回$scope.ammontOfficedOrders,但仍然没有返回任何内容。这可能是作用域继承的问题吗?如果是,我应该怎么做才能解决这个问题?如果没有。。。不管怎样,还是帮帮我吧:D


非常感谢

您正在AJAX调用(异步)中更新AmmonOfficeOrders,并试图在更新之前(即在收到响应之前)在脚本中访问它。因此,您无法获得该值

因此,您应该将代码即$scope.data移动到成功回调函数中

.success(function (data) {
       $scope.ammountOfFinishedOrders = data.GetAmmountOfFinishedOrdersResult;     
       // move your code here

})
.success(function (data) {
           $scope.ammountOfFinishedOrders = data.GetAmmountOfFinishedOrdersResult;     
           updateScope();

    })

var updateScope = function() {
    // your code here
};
您还可以在success回调函数中调用函数,并在该函数中执行更新

.success(function (data) {
       $scope.ammountOfFinishedOrders = data.GetAmmountOfFinishedOrdersResult;     
       // move your code here

})
.success(function (data) {
           $scope.ammountOfFinishedOrders = data.GetAmmountOfFinishedOrdersResult;     
           updateScope();

    })

var updateScope = function() {
    // your code here
};

问题的本质是异步的
GraphService.GetAmountOfficeOrders()是一个异步调用,这意味着您直接进入下一行代码,即:

//HOWEVER... here is undefined
console.log("value 2:", $scope.ammountOfFinishedOrders)
只有在承诺得到解决(您从服务器得到响应)之后,才会触发成功/错误,并且进入这些代码块

关于做什么,这取决于你需要实现什么。如果你需要分配一个变量,那么就这样做。如果你需要回到某个方面,那就需要一种不同的方法。

这很简单,朋友:-)

您调用了
GraphService
,这是一种异步服务,当它返回它时,您的
console.log(“值2:”,$scope.ammontoffinishedorders)
console.log(“值3:”,$scope.ammontoffinishedorders)
已经被明确执行,它将是未定义的

要克服这一点,你可以这样做

$scope.$watch(ammountOfFinishedOrders,function(newVal){
 $scope.data = [
      newVal, 4, 1, 3, 2, 1, 4
    ];
}))

或者把它放在你的成功里

 GraphService.getAmmountOfFinishedOrders()
            .success(function (data) {
                $scope.ammountOfFinishedOrders = data.GetAmmountOfFinishedOrdersResult;
$scope.data = [
      $scope.ammountOfFinishedOrders, 4, 1, 3, 2, 1, 4
    ];
            //this console.log shows me the value 3. Excellent!
            console.log("value 1:", $scope.ammountOfFinishedOrders)

            })
            .error(function (error) {
                $scope.status = 'Unable to load data:' + error.message;
            });

希望有帮助:)

您的问题是由于异步方法调用造成的。显然,您不会在“dataforGraphs”方法下面得到结果

您可以通过回调方法更好地处理此问题。当GraphService方法执行时,它将调用“success”或“error”回调,您可以从那里调用回调方法,如下所示

 function dataforGraphs(SuccessCallBack, FailedCallBack) {

       GraphService.getAmmountOfFinishedOrders()
            .success(function (data) {
SuccessCallBack(data.GetAmmountOfFinishedOrdersResult);

            })
            .error(function (error) {
                $scope.status = 'Unable to load data:' + error.message;
FailedCallBack(error);
            });

    };

function SuccessCallBack(result){
  //do your success logic here
}

function FailedCallBack(error){
}

非常感谢。成功了!我现在可以停止用头撞击计算机了:D我没有意识到异步效应。再次感谢。@nikhil+1的计时:)嘿,谢谢:)我先找到了nikhil的答案,它成功了。不过,我对您建议的$scope.$watch方法很好奇。稍后,我将确定它在我的示例中是否有效,因为它的目的是用来自de DB的值填充数组“data”,即:而不仅仅是$scope.data=[$scope.ammontoffinishedorders,4,1,3,2,1,4];我将有$scope.data=[$scope.ammontofficientedorders,$scope.ammontofdelayedorders,$scope.ammontofccanceledorders];也许我必须用newVal1,newVal2更新值。。。有可能吗?嘿,你可以找$watchGroup这里是doc谢谢!:)这有助于我理解这个问题。我首先选择了nikhil解决方案,它成功了。以后我会试试你的方法。谢谢你的回答:)