Odoo 通过Javascript调用模型中自定义方法

简介: Odoo 通过Javascript调用模型中自定义方法

实践环境

Odoo 14.0-20221212 (Community Edition)

代码实现

在js脚本函数中调用模型中自定义方法:

this._rpc({
    model: 'demo.wizard', // 模型名称,即模型类定义中 _name 的值
    method: 'action_select_records_via_checkbox', // 模型中自定义名称
    args: ['arg_value'] // 传递给模型方法参数列表,列表中每个元素对应模型方法的一个位置参数
}).then(function (res) { // res为模型方法返回值
    console.log(res);
    // do something
});

模型方法定义

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from odoo import models,fields,api
class DemoWizard(models.TransientModel):
    _name = 'demo.wizard'
    _description = 'demo wizard'
    #...此处代码已省略
    @api.model
    def action_select_records_via_checkbox(self, *args):
        '''通过wizard窗口界面复选框选取记录时触发的操作
        @params: args 为tuple元组,如果方法不采用位置参数,则传递的是啥,参数就是啥
        '''
        # do something
        return True

注意:this._rpc函数不能在非普通函数中使用,其使用范围可参考以下示例

odoo.define('estate.ListRenderer', function (require) {
    "use strict";
  var ListRenderer = require('web.ListRenderer');
  ListRenderer = ListRenderer.extend({
        _onToggleCheckbox: function (ev) {
            //// ...此处代码已省略
            this._rpc({
                model: this.modelName,
                method: this.modelMethod,
                args: [this.recordsSelected]
            }).then(function (res) {
                // ...此处代码已省略
            });
             ...
            this._super.apply(this, arguments);
        }
  });
    // ...此处代码已省略
});

那问题来了,如果希望在普通的javascript函数中使用上述请求功能,咋办?参考如下示例代码

示例代码

function do_confirm_action(modelName, modelMethod){
    $("button[name='action_confirm']").attr("disabled", true);
    var wizard_dialog = $(event.currentTarget.offsetParent.parentElement.parentElement);
    var dataUUID = $(event.currentTarget.parentElement.parentElement.parentElement.parentElement).find('div.o_list_view').prop('id');
    var rpc = odoo.__DEBUG__.services['web.rpc']; 
    rpc.query({
        model: modelName,
        method: modelMethod,
        args: [JSON.parse(window.sessionStorage.getItem(dataUUID) || '{}')]
    }).then(function (res) {
        if (res == true) {
            wizard_dialog.css('display', 'none');
            window.sessionStorage.removeItem(dataUUID);
        } else {
            $("button[name='action_confirm']").attr("disabled", false);
        }
    }).catch(function (err) {
        $("button[name='action_confirm']").attr("disabled", false);
    });
}
目录
相关文章
|
1天前
|
前端开发 JavaScript
前端 JS 经典:数组去重万能方法
前端 JS 经典:数组去重万能方法
6 0
|
1天前
|
前端开发 JavaScript 流计算
前端 js 经典:字符串超全方法总结
前端 js 经典:字符串超全方法总结
9 0
|
1天前
|
前端开发 JavaScript
前端 js 经典:数组常用方法总结
前端 js 经典:数组常用方法总结
11 0
|
2天前
|
前端开发 JavaScript 开发者
JavaScript中的异步编程方法总结
在JavaScript开发中,处理异步操作是非常常见的情况。本文将总结JavaScript中常用的异步编程方法,包括Callback、Promise、Async/Await等,分析其优缺点,并提供使用建议。
|
4天前
|
缓存 前端开发 JavaScript
React和Next.js开发常见的HTTP请求方法
React和Next.js开发常见的HTTP请求方法
7 0
|
4天前
|
前端开发 JavaScript
前端 JS 经典:Math 常用方法汇总
前端 JS 经典:Math 常用方法汇总
6 0
|
4天前
|
前端开发 JavaScript
前端 js 经典:Object 常用原生方法
前端 js 经典:Object 常用原生方法
10 2
|
4天前
|
前端开发 JavaScript
前端 js 经典:array 原生方法
前端 js 经典:array 原生方法
10 1
|
4天前
|
JavaScript 前端开发
JS中正则方法的使用 - 蓝易云
以上就是JavaScript中正则方法的基本使用。这些方法可以用于执行复杂的字符串处理和验证任务。
25 1
|
5天前
|
JavaScript 前端开发
JavaScript的`apply`方法:函数的“应用”与“调用”
JavaScript的`apply`方法:函数的“应用”与“调用”