【问题标题】:How to patch JS function that doesn't belong to a class如何修补不属于某个类的 JS 函数
【发布时间】:2023-02-04 04:53:04
【问题描述】:

我是一个完整的 JS n00b,我真的很难弄清楚这一点。我正在尝试更改图表中使用的默认颜色。在 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 函数,而不是替换它。通常我认为我会用 getColors 函数修补类,我认为这会起作用,但在这种情况下没有要修补的类。在没有父级修补的情况下,我该如何替换这个函数?

【问题讨论】:

  • 如果您创建了自己的 colors.js 文件,那么不要导入 getColors 函数并使用您自己的。我不明白你所说的“这不是一个类”是什么意思,因为它只是模块中的一个简单函数导出。除非您修改源代码本身,否则您不能覆盖该功能(这不是模块的想法)。问题是常量 MY_COLORS_BRIGHT - 这些在函数中返回,您需要更改它们的值。
  • getColors 函数(或者实际上 colors.js 文件中的 getColor 函数)在 Odoo 的许多地方使用。我不能(或者更确切地说不想)继承/修补/以其他方式修改调用此函数的所有位置,而不是调用我自己的。我需要改为修补原始函数以调用不同的函数。我已经解决了这个问题 - 请参阅下面的解决方案。

标签: javascript odoo odoo-16


【解决方案1】:

我已经解决了我自己的问题。这里的关键是用import * as colors 导入整个 colors.js 文件,然后用新函数修补 colors。我不确定为什么,但是当这样做时,我无法直接修补 getColors 函数(仍然会调用原始函数)。但是修补getColor(这是所有其他模块实际调用的)并使用我自己的getMyColors函数它起作用了。

/** @odoo-module **/
import { patch } from '@web/core/utils/patch';
import * as colors from '@web/views/graph/colors';

const MY_COLORS_BRIGHT = [
    "#1f77b4",
    // rest removed for brevity
];

const MY_COLORS_DARK = [
    "#00ffff",
    // rest removed for brevity
];

function getMyColors(colorScheme) {
    return colorScheme === "dark" ? MY_COLORS_DARK : MY_COLORS_BRIGHT;
}

patch(colors, 'my_module.colors', { 
    getColor(index, colorScheme) {       
        const colors = getMyColors(colorScheme); 
        return colors[index % colors.length]; 
    } 
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 2015-11-15
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多