如何修补不属于类的JavaScript函数?Odoo自定义需求
问题
我是一名JavaScript新手,目前正为此事困扰:我想要修改图表使用的默认颜色。在web/views/graph/colors.js文件中有一个getColors函数,它仅返回图表所用的颜色数组,我认为直接用自定义颜色数组重写该函数是最佳方案,但由于该函数不属于任何类,我始终无法找到正确的修补方式。
原代码(所有代码均不在类内部):
/** @odoo-module **/ const COLORS_BRIGHT = [ "#1f77b4", // rest removed for brevity ]; const COLORS_DARK = [ "#00ffff", // rest removed for brevity ]; // this is the function I want to replace with my own export function getColors(colorScheme) { return colorScheme === "dark" ? COLORS_DARK : COLORS_BRIGHT; } // a few more functions that I don't care about
我编写了自己的colors.js文件,代码如下:
/** @odoo-module **/ import { patch } from '@web/core/utils/patch'; import { getColors } from '@web/views/graph/colors'; const MY_COLORS_BRIGHT = [ "#1f77b4", // rest removed for brevity ]; const MY_COLORS_DARK = [ "#00ffff", // rest removed for brevity ]; patch(getColors, 'my_module.colors', { getColors(colorScheme) { return colorScheme === "dark" ? MY_COLORS_DARK : MY_COLORS_BRIGHT; } }
显然这种方式无效——它会在旧的getColors函数内部新增一个getColors方法,而非替换原函数。通常我会修补包含该函数的类,但此处没有可修补的类。请问在无父类的情况下,该如何替换这个函数?
解决方案
Odoo的patch工具仅适用于类或对象的属性修补,对于独立导出的函数,你可以选择两种可靠方案:
方案一:模块文件重定向(推荐)
通过Odoo的模块资产覆盖机制,用你的自定义文件替换原文件,步骤如下:
- 在你的模块中创建对应路径的文件:
my_module/static/src/web/views/graph/colors.js - 在该文件中重新实现
getColors,并保留原文件其他导出内容(如果需要) - 在模块
manifest.js中配置资产覆盖
自定义colors.js代码:
/** @odoo-module **/ const MY_COLORS_BRIGHT = [ "#1f77b4", // 替换为你的自定义亮色数组 ]; const MY_COLORS_DARK = [ "#00ffff", // 替换为你的自定义暗色数组 ]; export function getColors(colorScheme) { return colorScheme === "dark" ? MY_COLORS_DARK : MY_COLORS_BRIGHT; } // 保留原文件其他导出函数(如果不需要可以删除这行) export * from '@web/views/graph/colors'; // 用自定义实现覆盖getColors export { getColors };
manifest.js配置:
{ // 其他模块配置项... 'assets': { 'web.assets_backend': [ 'my_module/static/src/web/views/graph/colors.js', ], 'override': { '@web/views/graph/colors.js': 'my_module/static/src/web/views/graph/colors.js', }, }, 'depends': ['web'], }
方案二:直接替换函数引用
如果不想创建文件结构,可以在模块初始化时直接修改原函数的引用,这种方式更简洁:
/** @odoo-module **/ import * as graphColors from '@web/views/graph/colors'; const MY_COLORS_BRIGHT = [ "#1f77b4", // 自定义颜色 ]; const MY_COLORS_DARK = [ "#00ffff", // 自定义颜色 ]; // 直接替换原函数 graphColors.getColors = function(colorScheme) { return colorScheme === "dark" ? MY_COLORS_DARK : MY_COLORS_BRIGHT; };
注意:确保你的模块在web模块之后加载,通过depends配置['web']即可保证顺序。
内容的提问来源于stack exchange,提问作者dwyatt
相关产品推荐
相关产品推荐

