Angular动态键赋值报错TypeError: Cannot read property of undefined求解决方案
解决动态赋值对象键时的"TypeError: Cannot read property of undefined"问题
这个错误的核心原因很明确:你试图给$scope.model.currentLoadedContent添加属性,但它(或者它的上层对象$scope.model)目前是undefined——在JavaScript里,你不能直接给一个未初始化的undefined对象设置属性。
下面是几种可行的解决方案:
1. 先初始化目标对象(最兼容的写法)
在执行赋值操作前,先确保$scope.model和$scope.model.currentLoadedContent都是有效的对象:
// 先检查并初始化$scope.model if (!$scope.model) { $scope.model = {}; } // 再检查并初始化currentLoadedContent if (!$scope.model.currentLoadedContent) { $scope.model.currentLoadedContent = {}; } // 你的赋值逻辑(这里优化了重复的Object.keys调用) var contentList = Object.keys(content)[0]; $scope.model.currentLoadedContent[contentList] = content[contentList];
2. 使用ES6+语法简化初始化(环境支持时)
如果你的项目环境支持ES2020及以上的语法,可以用空值合并操作符(??)和可选链(?.)来简化代码:
var contentList = Object.keys(content)[0]; // 确保currentLoadedContent存在,不存在就初始化为空对象 $scope.model.currentLoadedContent = $scope.model.currentLoadedContent ?? {}; // 完成赋值 $scope.model.currentLoadedContent[contentList] = content[contentList]; // 甚至可以写成一行更简洁的形式 ($scope.model?.currentLoadedContent ??= {})[contentList] = content[contentList];
注意:AngularJS项目如果是较老的版本,可能需要配置Babel来支持这些新语法。
3. 额外的边界检查(避免content为空的情况)
还要确保content不是空对象,否则Object.keys(content)[0]会返回undefined,可能引发新的问题:
// 先判断content是否有可枚举属性 if (Object.keys(content).length === 0) { console.warn("content对象为空,无法获取键"); return; // 或者做其他处理 } // 再执行后续的初始化和赋值逻辑 var contentList = Object.keys(content)[0]; // ... 初始化currentLoadedContent的代码 $scope.model.currentLoadedContent[contentList] = content[contentList];
内容的提问来源于stack exchange,提问作者nand
相关产品推荐
相关产品推荐

