向$scope.comments推入数据时initial字段comment.owner为undefined的问题
解决$scope.comments.push时comment.owner为undefined的问题
看起来你遇到的问题是在往$scope.comments里推评论对象时,capitaliseUsername(comment.owner)里的comment.owner突然变成了undefined,但服务器返回的JSON明明包含这个字段,其他字段也能正常读取——这种情况我之前也碰到过,大概率是几个常见的小坑,咱们一步步排查:
1. 先确认push时comment对象的真实结构
首先别着急找函数的问题,先在push代码前加两行日志,直接看当前comment对象到底是什么样的:
console.log('准备推入的comment对象:', comment); console.log('此时的comment.owner:', comment.owner);
运行后看浏览器控制台,你会发现两种可能:
- 要么
comment本身就是undefined(但你说其他字段正常,这种概率很低) - 要么
comment.owner确实是undefined,但服务器返回的JSON里有owner——这时候就要核对服务器返回的JSON结构,是不是owner在嵌套层级里?比如后端返回的是comment.user.owner或者comment.data.owner,而你直接取了comment.owner?
2. 排查capitaliseUsername函数的问题
如果日志里显示comment.owner是有值的,但传入函数后出了问题,那大概率是函数内部的问题:
- 比如函数里误用了
this(在AngularJS的控制器里,this指向可能和你预期的不一样) - 或者函数本身对空值的处理有问题
可以先把函数替换成一个简单的测试代码验证:
initial: comment.owner ? comment.owner.charAt(0).toUpperCase() + comment.owner.slice(1) : '未知'
如果这样能正常显示首字母大写的内容,那就是capitaliseUsername函数的问题,回去检查函数内部逻辑即可。
3. 确认异步操作的时机
如果你的comment是通过$http或者其他异步请求获取的,有没有可能在数据还没返回的时候就执行了push操作?比如这种错误写法:
// 错误:在异步回调外执行push,此时comment还没被赋值 $http.get('/api/comments').then(function(res) { comment = res.data; }); // 这里comment还是初始的undefined,所以comment.owner自然也是undefined $scope.comments.push({ ... });
这种情况要确保push操作完全在异步回调的内部执行,等数据拿到手再处理。
4. 加个安全校验避免崩溃
最后,不管什么原因,给代码加个安全校验总是好的,避免因为某个字段缺失导致整个功能崩溃:
// 先确认comment和comment.owner都存在 if (comment && comment.owner) { $scope.comments.push({ id: comment.id, text: comment.text, timestamp: comment.timestamp, owner: comment.owner, card: comment.card, initial: capitaliseUsername(comment.owner) }); } else { console.warn('评论数据异常,跳过推入:', comment); }
按照这个步骤排查,基本上就能找到问题所在了。
内容的提问来源于stack exchange,提问作者bogere goldsoft
相关产品推荐
相关产品推荐

