Odoo 自定义Widgets 基础教程(章节1)

简介:

大家好,

此次,我们主要讲解 Odoo 中的Widgets。

网上、论坛里很多提及Widget的文章,但很少说Odoo自定义Widget 是如何实现的,这一直是大家所苦恼的地方。本章,将对Odoo中的Widget 进行基础讲解。

首先, Widget【挂件】产生的目的,是为了方便后端开发人员在不熟悉JavaScripts 的情况下,能快速地实现前端视图展示。

我们来看看Widget 所在的目录:

/addons/web/src/static/src/js/core/widget.js

其次,要理解Widget 原理,就是通过js把现有视图或者DOM一类对象进行渲染。所有代码都在前端!就是说,视图是通过客户端来渲染完成的!

这里最核心的一段代码:

var Widget = core.Class.extend(mixins.PropertiesMixin, ServicesMixin,{ 

.......定义各种方法.......

}

方法说明及解释如下:

init: function (parent)
构造部件并设置父节点;

*父节点的意义在于将当前实例绑定到给定的小部件实例。可以为空。当通过调用destroy方法时,当此挂件实例将被摧毁。

willStart: function ()
方法在“初始化 init”和“开始”之间调用。执行渲染和启动方法所需的异步调用。

destroy: function ()
摧毁当此挂件实例

appendTo: function (target)
渲染当前的小部件并将其附加到给定的jQuery对象或控件上。
target 为jQuery对象或控件实例。

prependTo: function (target) {},
渲染当前的小部件并将其预置到给定的jQuery对象或控件上。
target 为jQuery对象或控件实例。
append()和prepend()的作用(区别)

append()用于在被选元素的结尾插入元素。
prepend()用于在被选元素的开头插入元素。

看下面的HTML代码

<div id="test">
  <p>a</p>
</div>

使用 append( ) 和 prepend( )添加元素

$(document).ready(function(){
    $("#test").append("<p>b</p>") //使用append()添加 b 段落
    $("#test").prepend("<p>c</p>") //使用 prepend()添加 c 段落
})

效果如下

<div id="test">
<p>c</p>
<p>a</p>
<p>b</p>
</div>

insertAfter: function (target) { },

insertAfter()函数用于将所有匹配元素插入到指定元素之后的位置:

<p>段落文本1<span></span></p>
<p>段落文本2<span></span></p>
<!--以上是jQuery代码执行前的html内容-->
<script type="text/javascript">
$('<!--插入到p元素之后的位置-->').insertAfter( "p" );
// 其返回值就是匹配插入内容(两个注释元素'<!--插入到p元素之后的位置-->')的jQuery对象
</script>
<!--以下是jQuery代码执行后的html内容-->

<p>段落文本1<span></span></p><!--插入到p元素之后的位置-->
<p>段落文本2<span></span></p><!--插入到p元素之后的位置-->

insertBefore: function (target) { }

insertBefore()函数用于将所有匹配元素插入到指定元素之前的位置:

<p>段落文本1<span></span></p>
<p>段落文本2<span></span></p>
<!--以上是jQuery代码执行前的html内容-->
<script type="text/javascript">
$('<!--插入到p元素之前的位置-->').insertBefore( "p" );
// 其返回值就是匹配插入内容(两个注释元素'<!--插入到p元素之前的位置-->')的jQuery对象
</script>
<!--以下是jQuery代码执行后的html内容-->

<!--插入到p元素之前的位置--><p>段落文本1<span></span></p>
<!--插入到p元素之前的位置--><p>段落文本2<span></span></p>

attachTo: function (target) { }
将当前挂件附加到DOM元素上
【这也是odoo field中添加 widgets 后,可以对字段进行渲染的核心】

var self = this;
        this.setElement(target.$el || target);
        return this.willStart().then(function () {
            return self.start();
        });

replace: function (target) {}
渲染当前窗口挂件并替换给定的jQuery对象

start: function () {}

此方法一般是在渲染完成后调用。主要用于绑定动作,执行异步操作,调用动作等。

一般来说,此方法应该返回一个可以传递到$.when()的对象来通知调用方这个小挂件已经初始化

renderElement: function () {},
replaceElement: function ($el) { }
setElement: function (element) {}

大同小异,最后三种方法留给大家去探索。

目录
相关文章
|
Java
【编程进阶知识】静态代理、JDK动态代理及Cglib动态代理各自存在的缺点及代码示例
本文介绍了三种Java代理模式:静态代理、JDK动态代理和Cglib动态代理。静态代理针对特定接口或对象,需手动编码实现;JDK动态代理通过反射机制实现,适用于所有接口;Cglib动态代理则基于字节码技术,无需接口支持,但需引入外部库。每种方法各有优缺点,选择时应根据具体需求考虑。
157 1
|
Android开发
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
233 0
|
11月前
|
JSON NoSQL Redis
Redis Stack是什么,你知道吗?
Redis Stack 是 Redis 官方推出的一款新产品,扩展了 Redis OSS 的核心功能,提供完整的开发人员体验。它支持概率数据结构、可查询的 JSON 文档、跨哈希和 JSON 文档查询、时间序列数据处理等高级功能。Redis Stack 包含 Redis Stack Server、RedisInsight 和客户端 SDK,适用于构建实时应用程序。安装方式包括直接安装和 Docker 安装,使用方法与 Redis 类似,支持 JSON、Bloom Filter 等数据类型及操作命令。
1671 1
|
11月前
|
网络协议 应用服务中间件 网络安全
odoo17在线聊天报错提示 Couldn‘t bind the websocket...
当 Odoo 17 报错 "Couldn't bind the websocket..." 时,通过检查和配置 WebSocket 端口、防火墙规则、代理服务器以及 Odoo 配置文件,可以有效解决此问题。确保每一步操作准确无误,最终重启相关服务,使配置生效。希望这些步骤能帮助您快速恢复 Odoo 的在线聊天功能。
410 1
|
编解码 Java Linux
开源文档预览项目 kkFileView (9.9k star) ,快速入门
kkFileView 是一款文件文档在线预览解决方案,采用流行的 Spring Boot 框架构建,易于上手和部署。 该项目基本支持主流办公文档的在线预览,包括但不限于 doc、docx、xls、xlsx、ppt、pptx、pdf、txt、zip、rar,以及图片、视频、音频等格式。
开源文档预览项目 kkFileView (9.9k star) ,快速入门
|
小程序 Python
分享41个微信小程序源码,总有一款适合您
分享41个微信小程序源码,总有一款适合您
884 2
|
NoSQL Redis 容器
Redis大Key问题 - 标准、原因、查找
【6月更文挑战第13天】**大Key标准**在不同场景各异,一般string超1MB或容器超10k元素视为大;高并发场景中,string超10KB,容器超5k或整体10MB。**阿里云Redis**中,大Key可能表现为String值5MB,ZSET成员10k,或Hash总值100MB。**大Key影响**包括高读取成本、操作阻塞、存储压力不均。**产生原因**多源于业务设计、动态增长管理和程序错误。**查找大Key**可通过云服务的实时/离线统计,`redis-cli --bigkeys`或使用Redis RDB Tools分析RDB文件。注意,某些特定需求可能需额外工具。
376 1
|
开发框架 缓存 前端开发
使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件
使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件
|
存储 机器学习/深度学习 安全
云计算与网络安全的融合之路:策略、挑战与未来展望
【5月更文挑战第13天】 随着数字化转型的不断深入,云计算已成为企业及个人存储和处理数据的首选平台。然而,云服务的广泛使用也引入了新的安全风险和挑战,尤其是在数据保护、隐私和合规性方面。本文探讨了云计算环境下网络安全的现状,分析了当前面临的主要安全威胁,并提出了相应的防护措施。同时,文中还讨论了如何通过采用创新的安全技术和策略来加强云计算的安全性,以及在不断变化的网络威胁环境中保持弹性的必要性。最后,文章对未来云计算和网络安全的发展趋势进行了展望,指出了实现更安全云计算环境的潜在途径。