Odoo 14前端JS数组元素appActive访问异常问题求助
我在开发Odoo 14模块实现菜单应用筛选功能时遇到一个问题:在JS代码中构造的_apps数组包含appActive属性,但调用_filterApps后,打印整个数组能看到该属性,单独访问apps[0].appActive却获取不到值,而apps[0].menuID可以正常访问。
相关代码
构造_apps数组的代码:
this._apps = _.map(menuData.children, function (appMenuData) { return { actionID: parseInt(appMenuData.action.split(',')[1]), menuID: appMenuData.id, name: appMenuData.name, xmlID: appMenuData.xmlid, web_icon_data: appMenuData.web_icon_data, appActive: appMenuData.active, }; });
获取并打印apps的代码:
getApps: function () { var apps = this._filterApps(this._apps); console.log(apps); console.log(apps[0].appActive); console.log(apps[0].menuID); return apps; },
可能的原因及解决方案
1. _filterApps函数修改了元素结构
如果_filterApps在处理数组时,返回的新对象未复制appActive属性,会导致该属性丢失。比如函数内部通过对象解构或手动构造新对象时遗漏了appActive。
解决方式:检查_filterApps的实现,确保返回的元素完整保留appActive:
_filterApps: function(apps) { return apps.filter(app => /* 你的筛选条件 */).map(app => { // 解构原对象保留所有属性,再添加自定义处理 return { ...app, // 其他需要修改的属性 }; }); }
2. console.log的实时性误导
浏览器的console.log打印对象时,显示的是对象的当前实时状态,而非调用console.log时的状态。如果appActive是在打印后才被动态赋值的,就会出现“打印数组能看到,但单独访问时获取不到”的情况。
验证方式:用JSON.stringify打印元素的快照,确认调用时的实际属性:
getApps: function () { var apps = this._filterApps(this._apps); console.log('Apps snapshot:', JSON.stringify(apps)); console.log('appActive value:', apps[0] ? apps[0].appActive : 'apps[0]不存在'); console.log('menuID value:', apps[0] ? apps[0].menuID : 'apps[0]不存在'); return apps; },
3. appMenuData.active初始值异常
构造_apps数组时,appMenuData.active可能本身是undefined或不存在,后续有代码动态为_apps元素添加了appActive,但_filterApps处理时未保留这个动态添加的属性。
验证方式:在构造数组时添加日志,确认初始值:
this._apps = _.map(menuData.children, function (appMenuData) { console.log('当前菜单的active值:', appMenuData.active); return { actionID: parseInt(appMenuData.action.split(',')[1]), menuID: appMenuData.id, name: appMenuData.name, xmlID: appMenuData.xmlid, web_icon_data: appMenuData.web_icon_data, appActive: appMenuData.active, }; });
4. 属性枚举性问题
极少数情况下,appActive可能被设置为不可枚举属性,导致直接访问时无法获取,但console.log会强制显示所有属性。
验证方式:打印元素的所有自有属性名,确认是否包含appActive:
console.log('apps[0]的所有属性:', Object.getOwnPropertyNames(apps[0]));
内容的提问来源于stack exchange,提问作者Carlos Alberto Arronte

