ui-grid中ng-if使用row.entity.xx作为参数的异常问题排查
解决AngularJS ng-if中数组indexOf结合变量失效的问题
看起来你遇到的问题大概率是类型不匹配导致的,我来给你拆解分析并给出解决方案:
问题根源
你提到row.entity.id的值是1,但这里的1很可能是字符串类型的"1",而你数组里的元素是数字类型的1。indexOf方法是基于严格相等(===)来匹配的,字符串和数字不会被视为相等,所以[1,2,3].indexOf("1")会返回-1,直接导致ng-if判断不生效。
而row.entity.id == 1能正常工作,是因为==是宽松相等运算符,会自动做类型转换——字符串"1"会被转成数字1后再比较,所以结果为true。
验证方法
你可以先在页面上打印row.entity.id的类型来确认:
<!-- 打印变量类型 --> <div>{{typeof row.entity.id}}</div>
如果输出是string,那就能坐实这个类型不匹配的问题了。
解决方案
你可以选下面任意一种方法解决:
把数组元素改成字符串类型
<div ng-if="['1','2','3'].indexOf(row.entity.id) > -1">...</div>把row.entity.id转成数字类型
用Number()或者parseInt()做类型转换:<div ng-if="[1,2,3].indexOf(Number(row.entity.id)) > -1">...</div>使用控制器自定义方法(更优雅)
如果你觉得在模板里写转换逻辑有点繁琐,可以在控制器里定义一个判断方法:// 控制器内代码 $scope.isIdInTargetList = function(id) { // includes方法返回布尔值,比indexOf判断>-1更直观 return [1,2,3].includes(Number(id)); }然后在模板里调用这个方法:
<div ng-if="isIdInTargetList(row.entity.id)">...</div>
内容的提问来源于stack exchange,提问作者Cloud_cal
相关产品推荐
相关产品推荐

