odoo17核心概念view7——listview总体框架分析

这是view系列的第七篇文章,今天主要介绍我们最常用的list视图。
在这里插入图片描述

1、先看list_view,这是主文件

/** @odoo-module */

import { registry } from "@web/core/registry";
import { RelationalModel } from "@web/model/relational_model/relational_model";
import { ListArchParser } from "./list_arch_parser";
import { ListController } from "./list_controller";
import { ListRenderer } from "./list_renderer";

export const listView = {
    type: "list",
    display_name: "List",
    icon: "oi oi-view-list",
    multiRecord: true,
    Controller: ListController,
    Renderer: ListRenderer,
    ArchParser: ListArchParser,
    Model: RelationalModel,
    buttonTemplate: "web.ListView.Buttons",

    limit: 80,

    props: (genericProps, view) => {
        const { ArchParser } = view;
        const { arch, relatedModels, resModel } = genericProps;
        const archInfo = new ArchParser().parse(arch, relatedModels, resModel);

        return {
            ...genericProps,
            Model: view.Model,
            Renderer: view.Renderer,
            buttonTemplate: view.buttonTemplate,
            archInfo,
        };
    },
};

registry.category("views").add("list", listView);

跟formview基本一样的格式,只是结构体里面少了compiler,可能是用了基类ViewCompiler。

2、ListController

跟表单控制有关的部分, 增删改查按钮,搜索框,分页等

3、ListRenderer

list主体内容的渲染,其实就是渲染了一个表格, 对list视图的扩展也大多是对它进行修改。我们来详细的看一看。

3.1 list_renderer.js

主题部分就不看了,看最后面的部分
注意,这里定义了4个模板。


ListRenderer.template = "web.ListRenderer";

ListRenderer.rowsTemplate = "web.ListRenderer.Rows";
ListRenderer.recordRowTemplate = "web.ListRenderer.RecordRow";
ListRenderer.groupRowTemplate = "web.ListRenderer.GroupRow";

3.2 list_renderer.xml

从 list_renderer.js中我们知道,xml文件里定义了4个模板。下面分别来分析一下。
web.ListRenderer
web.ListRenderer 定理了table的主体结构,包括三部分

  • thead 详细定义了头部
  • tbody 调用了子模板rowsTemplate ,也就是 “web.ListRenderer.Rows”;
  • tfoot 详细定义了尾部

看看tbody的调用方式, t-call 指令通过constructor.rowsTemplate 来调用ListRenderer.rowsTemplate,也就是 “web.ListRenderer.Rows”, 要学会这种调用方法,并且给子模板传递了一个变量list 它的值是props.list, 在web.ListRenderer.Rows模板中会用到这个变量。

 <tbody class="ui-sortable">
      <t t-call="{{ constructor.rowsTemplate }}">
          <t t-set="list" t-value="props.list"/>
      </t>
  </tbody>

web.ListRenderer.Rows
这个模板的结构也很简单,首先它会判断list的isGrouped属性,如果为假,说明没有分组,则通过foreach循环调用
web.ListRenderer.RecordRow 这个子末班,同时将record传递过去。 如果分组为真,则调用web.ListRenderer.GroupRow 模板,并传入group参数。
在这里插入图片描述
web.ListRenderer.RecordRow
这个模板渲染一行数据,通过foreach循环遍历所有的列

 <t t-foreach="getColumns(record)" t-as="column" t-key="column.id">
     <t t-if="column.type === 'field'">
         <t t-set="isInvisible" t-value="evalInvisible(column.invisible, record) or !(column.name in record.data)"/>
         <td t-on-keydown.synthetic="(ev) => this.onCellKeydown(ev, group, record)"
             class="o_data_cell cursor-pointer"
             t-att-class="getCellClass(column, record)"
             t-att-name="column.name"
             t-att-colspan="column.colspan"
             t-att-data-tooltip="!isInvisible ? getCellTitle(column, record) : false"
             data-tooltip-delay="1000"
             t-on-click="(ev) => this.onCellClicked(record, column, ev)" tabindex="-1">
             <t t-if="!isInvisible">
                 <t t-if="canUseFormatter(column, record)" t-out="getFormattedValue(column, record)"/>
                 <Field t-else="" name="column.name" record="record" type="column.widget" class="getFieldClass(column)" fieldInfo="column" t-props="getFieldProps(record, column)"/>
             </t>
         </td>
     </t>

4、list_arch_parser.js

arch解析器,不多说了

5、list_confirmation_dialog

顾名思义,对话框,还不知道怎么用,以后在补充吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/272400.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring中常见的Bean后处理器

Bean后处理器的作用&#xff1a;为Bean生命周期各个阶段提供扩展。接下来我们查看一个案例 public class TestBeanPostProcessor {public static void main(String[] args) {//该容器不存在任何Spring中的bean对象&#xff0c;是一个干净的容器&#xff0c;且提供了正常容器中…

运动轨迹仿真

重型运载火箭轨迹/总体参数一体化优化方法 硬核推导火箭运动方程&#xff0c;并用python仿真实现 rocket-simulation:MATLAB-火箭仿真软件 MatRockSim:Matlab 火箭飞行模拟器 【开源】飞鹰一号探空火箭——箭体设计、制造回顾与仿真对比 偏航角&#xff0c;滚动角&#xf…

基于双闭环PI的SMO无速度控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于双闭环PI的SMO无速度控制系统simulink建模与仿真&#xff0c;基于双闭环PI的SMO无速度控制系统主要由两个闭环组成&#xff1a;一个是电流环&#xff0c;另一个是速度环。…

2024深入评测CleanMyMac X4.14.6破解版新的功能

随着时间的推移&#xff0c;我们的Mac电脑往往会变得越来越慢&#xff0c;存储空间变得越来越紧张&#xff0c;这时候一个优秀的清理工具就显得尤为重要。作为一款备受好评的Mac清理工具&#xff0c;它能够为你的Mac带来全方位的清理和优化。在本文中&#xff0c;我们将深入评测…

中科驭数与宽睿科技达成战略合作,共筑超低时延软硬一体技术底座

近日&#xff0c;中科驭数&#xff08;北京&#xff09;科技有限公司&#xff08;简称“中科驭数”&#xff09;和上海宽睿信息科技有限责任公司&#xff08;简称“宽睿科技”&#xff09;完成战略合作协议签署。双方将结合各自在超低时延软硬件领域的深厚业务积累和技术产品优…

晶振的起振温度对电子设备的影响

晶振&#xff0c;作为电子设备中的关键元件&#xff0c;其性能参数对设备的稳定性和可靠性具有重要影响。其中&#xff0c;晶振的起振温度是决定其工作性能的重要因素之一。晶发电子将探讨晶振起振温度对电子设备的影响以及如何应对这些影响。 首先&#xff0c;我们要了解什么…

2023/12/26中断作业

成果图&#xff1a; 代码&#xff1a; 函数层 key_it.c #include "key_init.h" void key1_it_config() { //RCC时钟RCC->MP_AHB4ENSETR |(0X1<<5);//设置PF9管脚为输入GPIOF->MODER &(~(0x3<<18));//设置PF9管脚为exti9输入EXTI->EXTI…

减小PAPR——DFT扩频

文章目录 前言一、DFT 扩频原理二、MATLAB 仿真1、核心代码2、仿真结果①、4QAM 调制时 IFDMA、LFDMA 和 OFDMA 的 DFT 扩频技术的 PAPR 性能②、16QAM 调制时 IFDMA、LFDMA 和 OFDMA 的 DFT 扩频技术的 PAPR 性能③、64QAM 调制时 IFDMA、LFDMA 和 OFDMA 的 DFT 扩频技术的 PA…

如何在Photoshop中创建色彩鲜艳的文本效果

如何在 Photoshop 中制作霓虹灯 1. 如何创建背景 步骤 1 学习如何在 Photoshop 中制作霓虹灯文本的第一步是背景。创建一个新的 1160 x 750 像素文档&#xff0c;并将分辨率设置为 300。 转到"文件">"嵌入位置"&#xff0c;然后打开"垃圾灰色砖…

tensorrt环境安装-可用于深度学习模型加速推理

安装python环境 在anaconda的命令行中输入conda create --name py38 python3.8 安装python环境 然后安装深度学习框架pytorch环境 Previous PyTorch Versions | PyTorch 在这里面选择合适的环境 conda install pytorch1.8.0 torchvision0.9.0 torchaudio0.8.0 cudatoolki…

汽车项目管理

项目节点&#xff1a; MR (Management Review)——管理层评审 KO (Kick Off)——项目正式启动 SI (Strategy Intent)——战略意图 SC (Strategy Confirmation)——战略确认 PA (Program Approval)——项目批准 PR (Product Readiness)——产品就绪 VP (Verification Prototype)…

kubernetes -pod 实践

一、资源与对象 1、pod 容器都是由镜像启动的,但在容器外面会包裹通过Pod将容器包裹起来这个是K8s的概念,在这个Pod里面可以有一个或多个容器,那这个Pod的有什么特征呢 Pod里的所有容器都会调度在同一个节点上运行0。Pod中的所有容器会共享同一网络,它们有一个唯一的IP,…

leetcode 75. 颜色分类(medium)(优质解法)

链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 代码&#xff1a; class Solution {public void sortColors(int[] nums) {int left-1,rightnums.length,i0;while(i<right){if(nums[i]0){left;swap(nums,left,i);i;}else if(nums…

大师计划1.0 - log2 CRTO笔记

CRTOⅠ笔记 log2 这个笔记是我在2023年11月23日-12月22日中&#xff0c;学习CRTO所做的一些笔记。 事实上TryHackMe的路径和htb学院包含了许多CRTO的知识并且甚至还超出了CRTO&#xff08;CS除外&#xff09;&#xff0c;所以很多东西在THM和htb学院学过&#xff0c;这次CRTO等…

LLM应用于MPC

现有的基于学习的自动驾驶系统&#xff08;AD&#xff09;在理解高级信息和提供可解释性方面存在挑战。为了解决这些问题&#xff0c;这项工作采用LLM作为复杂AD场景的决策组件。作者设计了认知途径&#xff08;cognitive pathway&#xff09;来实现LLM的综合推理&#xff0c;并…

软件接口测试是什么?怎么测?

软件测试是一条超级长的跑道&#xff0c;最好分阶段来跑&#xff1a;先入行&#xff0c;后精通。网上能看到很多软件测试的帖子&#xff0c;但能够准确分类详细介绍的并不多。正好最近有时间&#xff0c;就把我所了解的软件测试做一个小小总结&#xff0c;对你有帮助的话&#…

【100个Cocos实例】环形ScrollView的实现方法

引言 Cocos中环形ScrollView的实现 大家好&#xff0c;今天是圣诞节&#xff0c;又是寒冷的一天。 在游戏开发中经常需要用到ScrollView去实现滚动的列表。 他通常包括垂直方向和水平方向两个选择。 本文将介绍一下ScrollView环形方向的实现。 本文源工程可在文末阅读原文…

ServletContext对象和ServletConfig对象

Servlet几个重要的类的关系图 ServletContext对象 问题&#xff1a; Request解决了一次请求内的数据共享问题&#xff0c;session解决了用户不同请求的数据共享问题&#xff0c;那么不同的用户的数据共享该怎么办呢&#xff1f; 解决&#xff1a;使用ServletContext对象 作…

关键字:extends关键字

在 Java 中&#xff0c;extends 是一个关键字&#xff0c;用于表示继承关系。当一个类使用 extends 关键字时&#xff0c;它表示该类是一个子类&#xff0c;并且继承了父类的属性和方法。 以下是 extends 关键字的解析&#xff1a; 语法&#xff1a; 描述&#xff1a; ChildC…

二分查找——OJ题(二)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、点名1、题目讲解2、算法原理3、代码实现 二、搜索旋转排序数组中的最⼩值1、题目讲解2、算…
最新文章