ODOO--OWL简介

1.什么是OWL
OWL是 Odoo 创建的前端开发框架。这是他们在最新版本的 Odoo(版本 14)中引入的一个框架,以使前端代码更好一些。如果您熟悉其他前端框架,如 React、Vue、Angular、Backbone 等,那么您将很快了解 OWL。它遵循许多相同的模式和想法。

如果您不熟悉前端框架的概念,那么最近的框架都围绕着消除过去通常使用 javascript 完成的琐碎事务性工作的想法展开。

我相信您熟悉数百行用于查找或操作 HTML 元素的 javascript。同时也做一些事情,比如跟踪事件侦听器绑定逻辑。这些框架消除了几乎所有繁重的工作,并将您的 HTML 和 javascript 更紧密地结合在一起。

坚持,稍等。不要逃跑。我知道我说的是“紧密耦合”,我知道这是一个危险信号。

但在某些时候,我们作为前端开发人员共同同意,将 HTML 和 javascript 结合起来实际上很有意义!它们本质上是相互依赖的。您可以编写并在其他不依赖 HTML 和浏览器的项目中重用纯的、无副作用的 javascript 代码非常少。因此,如果我们坚持使用这两种技术,那么让我们接受它并在这里关注可用性而不是模块化。

看一下这两个想法如何比较的一个非常基本的例子:

这里我们有一些简单的 HTML。这是2个按钮。一个按钮增加一个计数并显示它。一键将计数清零。

  
  

 
0

我们过去编写 javascript 的方式看起来非常接近于这样的:

 // ew, gross 
  
 const clicks = 0; 
  
 const countButton = document.querySelector("#countButton"); 
 myButton.addEventListener("click", function() { 
     clicks += 1; 
     const results = document.querySelector("#results"); 
     results.innerHTML = clicks; 
 }); 
  
 const clearButton = document.querySelector("#clearButton"); 
 clearButton.addEventListener("click", function() { 
     clicks = 0; 
     const results = document.querySelector("#results"); 
     results.innerHTML = click; 
 });                     

很长一段时间我们都习惯看到这种类型的代码,但这是一个小例子。随着应用程序的增长,它很快就会变得可怕。下面是像 OWL 这样的现代框架的样子:

Increment Count
Clear Count

const { Component, useState } = owl;

class ClickComponent extends Component {
state = useState({ count: 0 });
}

就是这样。我们跟踪一些数据和所有的事件监听器,DOM 操作的混乱会自动为我们处理。很酷。

  1. Odoo 为什么要创建 OWL?
    我不为 Odoo 工作,也没有参与创建 OWL,所以我不会过多谈论这个。总的来说,我知道他们想要改进他们的前端代码并实现一个现代框架。

如果您想知道为什么他们创建了一个全新的框架而不是使用现有框架,我建议您 通读他们针对该确切问题的文章。

三、主要特点
就个人而言,我认为 OWL 与处理前端开发的旧方法相比有 3 个主要好处。所有这些功能都以更优雅的方式实现,我非常喜欢任何能让我编写更简单、更优雅、更易读的代码的东西。

3.1. 生命周期组件
我过去用 javascript 编写的很多代码都有大量的样板代码来管理 DOM 的状态。我们需要不断考虑前端元素可能发生的所有事情,以确保我们的代码不会中断。

拥有具有生命周期和状态的组件是一个巨大的好处。我们知道,当页面加载我们的组件启动时,当页面重定向时,我们的组件可能会崩溃并消失。

我们可以为所有这些事情提供钩子。不再有$(document).ready 过去。

3.2. 与虚拟 dom 的反应式绑定
如果你参考我在介绍中开始的小例子,你会看到一个反应式绑定的例子。我们只需要考虑数据,数据将显示在哪里,以及数据将在何时被操作。所有的 DOM 操作代码都被抽象出来了。更改数据,前端会自动更新。简而言之,这就是反应式绑定。

有点相关,许多现代前端框架都提供了虚拟 DOM。这意味着他们在 javascript 中跟踪前端结构,主要是在幕后。这对开发人员进行调试等工作非常有帮助。我会在以后的文章中深入探讨这一点。

3.3. 可读性
我们已经有足够的时间来跟踪编写 javascript 了。添加手动跟踪事件侦听器和回调之类的需要只是为了简单地更新前端,可能会一团糟。但是消除这种负担使我们能够编写更好的代码、更具可读性的代码并处理更复杂的情况。

这对开发人员来说似乎微不足道,但在我的软件职业生涯中,成功地生成易于理解的代码可以让你在其他一切方面都有优势。代码更容易测试。代码更容易维护。代码更少错误。只是通过关注易于理解的代码,这个列表会继续下去。

PS:如果你还没有听过DHH 关于软件编写的演讲,我强烈推荐它。

  1. 入门
    本指南假设您了解一些 Odoo 开发的基本知识。如果您以前从未使用过 Odoo,您可能需要查看我们的其他一些文章,获取本地开发环境设置,并了解系统。
    OWL 被打包到 Odoo 14 及更高版本中。在本文中,我想专注于在 Odoo 中具体使用 OWL,而不是作为一个独立的前端框架。

与 Odoo 开发一样,我们必须有一个新模块可以使用。让我们设置最简单的一个,以便我们可以尝试一些 OWL 功能。

 intro_to_owl_part_1/ 
 ├── __manifest__.py 
 └── static 
     └── src 
         └── js 
             └── components               
 # __manifest__.py 
  
 { 
     "name": "Introduction to OWL in Odoo - Part 1", 
     "summary": "Provides an example module for OWL.", 
     "description": "Provides an example module for OWL.", 
     "author": "Oocademy", 
     "website": "http://www.oocademy.com", 
     "category": "Tutorials", 
     "version": "14.0.0.1", 
     "depends": ["base"], 
     "demo": [], 
     "data": [], 
 } 
  1. 添加我们的第一个组件
    OWL 通过定义Component类来工作,这些类可以被认为是 Web 组件。每个组件都以一个模板、绑定到该模板的数据以及任何子组件开始。

在 HTML 中,我们有所有这些标签,如header、div、 span、textarea等。在使用 OWL 时,您需要考虑“如果我可以创建一个全新的标签,对项目有什么用?”。所以也许你需要一个projectandtask 标签来显示项目管理系统的信息。或用于在您的软件系统中显示用户/客户的联系人标签。

在本文中,我们要创建一个组件,该组件显示在销售订单上的客户下方,该组件显示有关其订单历史记录的一些详细信息。

要将新组件添加到模块中,您需要 2 个步骤:

5.1. 第一步:创建并注册js类
将调用我们的新组件文件PartnerOrderSummary.js,并将其添加到static/src/js/components/.

 odoo.define("intro_to_owl_part_1.PartnerOrderSummary", function (require) { 
     const { Component } = owl; 
  
     class PartnerOrderSummary extends Component { 
         // 
     }; 
  
     Object.assign(PartnerOrderSummary, { 
         template: "intro_to_owl_part_1.PartnerOrderSummary" 
     }); 
 });               

Odoo 中的所有 javascript 文件都需要通过扩展资产模板和添加script标签来注册。在这种情况下,让我们创建一个assets.xml在模块根目录中调用的文件,如下所示: