当前位置: 首页 > news >正文

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) {}

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

相关文章:

  • 改maven下创建的动态网站依赖的jre版本
  • Linux 服务管理两种方式service和systemctl
  • 渗透测试(theharvester steghide)
  • Gsoap编译
  • springboot启动时可以用到的事件监听
  • 深入浅出 VuePress(一):如何做到在 Markdown 中使用 Vue 语法
  • 在首次发布三周之后,MLflow迎来了0.2版本
  • 共享文件远程读写 经常会出现 提示多重连接的问题
  • 云数据库架构演进与实践
  • TensorFlow学习_(2)
  • 企业级开发账号打包ipa
  • js常见事件
  • [转]多个ajax请求时控制执行顺序或全部执行后的操作
  • k8s 面向应用开发者的基础命令
  • leetcode-868-Binary Gap
  • 深入了解以太坊
  • [LeetCode] Wiggle Sort
  • 「面试题」如何实现一个圣杯布局?
  • Bootstrap JS插件Alert源码分析
  • ECMAScript入门(七)--Module语法
  • EventListener原理
  • Javascript 原型链
  • js
  • js正则,这点儿就够用了
  • Koa2 之文件上传下载
  • Sass 快速入门教程
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 开源SQL-on-Hadoop系统一览
  • 码农张的Bug人生 - 初来乍到
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 事件委托的小应用
  • 通过git安装npm私有模块
  • 通过几道题目学习二叉搜索树
  • 微信支付JSAPI,实测!终极方案
  • 延迟脚本的方式
  • 以太坊客户端Geth命令参数详解
  • 正则表达式
  • #《AI中文版》V3 第 1 章 概述
  • #stm32驱动外设模块总结w5500模块
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (5)STL算法之复制
  • (SpringBoot)第七章:SpringBoot日志文件
  • (九十四)函数和二维数组
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • .NET Core Web APi类库如何内嵌运行?
  • .net core 控制台应用程序读取配置文件app.config
  • .NET上SQLite的连接
  • .net下简单快捷的数值高低位切换
  • .考试倒计时43天!来提分啦!
  • @Autowired和@Resource的区别
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116