将JavaScript函数转为AngularJS函数时遇未定义属性错误求助
解决AngularJS中"Cannot read property '0' of undefined"的问题
你遇到的这个错误核心原因是异步请求的时序问题,再加上一个小语法错误,我给你一步步拆解并修正:
错误根源分析
- 异步请求的时序问题:你用
$scope.List = getAllList获取服务响应,但GET请求是异步执行的——当你立刻调用$scope.deptime()时,后端的数据还没返回,$scope.List其实还没被正确赋值,$scope.List.Time自然就是undefined,这时候访问它的[0]就会抛出你看到的错误。 - 语法错误:AngularJS中遍历数组的方法是
angular.forEach,而不是你写的angular.array.forEach,这也是会导致运行异常的点。
修正后的完整代码
首先,假设你的getAllList是一个封装了$http请求的服务方法(返回Promise),我们需要在请求完成后再处理数据:
// 先发起异步请求,等待数据返回 getAllList().then(function(responseData) { // 数据返回后再赋值给$scope $scope.List = responseData; // 此时数据已就绪,调用计算函数 $scope.deptime(); }); $scope.deptime = function() { // 先做安全校验,避免数据为空或未定义的情况 if (!$scope.List || !$scope.List.Time || $scope.List.Time.length === 0) { console.log("数据未就绪或Time数组为空"); $scope.total = 0; return; } $scope.array = $scope.List.Time; console.log($scope.array); // 用局部变量存储临时值,减少对$scope的频繁访问,提升性能 let max = $scope.array[0]; let total = 0; // 使用正确的AngularJS遍历方法 angular.forEach($scope.array, function(a) { if (a === max) { total += max; } else if (a > max) { max = total = a; } }); // 最后把结果赋值给$scope供页面使用 $scope.total = total; console.log("total:" + $scope.total); };
额外的优化建议
- 尽量用局部变量存储临时计算值(比如max、total),不要都挂在$scope上,这样能减少AngularJS脏检查的负担,提升性能。
- 始终在处理数组前做安全校验,就算后端返回了数据,也要确保
$scope.List.Time是一个非空数组,避免类似的错误再次发生。 - 确认后端返回的
Time字段确实是数组类型,如果是字符串或其他类型,需要先做转换处理。
内容的提问来源于stack exchange,提问作者WhoAmI
相关产品推荐
相关产品推荐

