• odoo javascript参考(四)


    Services
    在11.0版本中,我们引入了服务的概念。主要思想是为子组件提供一种受控的方式来访问其环境,这种方式允许框架进行足够的控制,并且是可测试的.

    服务系统围绕三个理念组织: services, service providers and widgets. 它的工作方式是,widget触发(使用trigger_up)事件,这些事件向服务提供商轮询,服务提供商将要求服务执行任务,然后可能返回应答结果.

    Service
    一个service是一个AbstractService在实例,它只一个名字和几个简单的方法。它的工作是执行一些工作,通常取决于环境。
    例如,我们有一个ajax服务(任务是执行是一个rpc),本地存储(与浏览器本地存储交互)和许多其他功能,举例,
    下面是一个关于如何实现ajax服务的简化示例:

    var AbstractService = require('web.AbstractService');
    
    var AjaxService = AbstractService.extend({
        name: 'ajax',
        rpc: function (...) {
            return ...;
        },
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    服务名字是ajax,并且定一个rpc方法。
    Service Provider
    为了使服务能够工作,我们有必要让Service Provider准备好发送自定义事件.在后端(web客户端),这是由主web客户端实例完成的. service provider的代码来自 ServiceProviderMixin.

    Widget
    widget 是请求服务的部分.为实现这个目标, 它触发一个事件call_service(通常通过使用helper函数调用). 此事件将请求传达给系统的其他部分.

    在实践中,一些函数经常被调用。例如,_rpc方法:

    var SomeWidget = Widget.extend({
        _getActivityModelViewID: function (model) {
            return this._rpc({
                model: model,
                method: 'get_activity_view_id'
            });
        },
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    RPC
    rpc 功能由 ajax 服务提供。

    在 Odoo 上工作时通常有两种情况:一种可能需要调用 (python) 模型上的方法(这通过控制器call_kw 进行),或者可能需要直接调用控制器(在某些路由上可用)。

    在 python 模型上调用方法:

    return this._rpc({
        model: 'some.model',
        method: 'some_method',
        args: [some, args],
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    直接调用路由控制器:

    return this._rpc({
        route: '/some/route/',
        params: { some: kwargs},
    });
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    Notifications(通知)

    odoo框架提供了一个标准的方法在屏幕右上角显示通知。
    通知有两种类型:
    通知: 通常用于显示一些反馈. 例如, 用户取消订阅频道。
    警告: 通常用于显示一些重要和紧急的信息. 通常是系统中最常见的且可恢复的错误.

    可以使用通知与用户互动,而不会干扰其工作流程. 想象一下,通过VOIP接收到一个电话:通过两个按钮“接受”和“拒绝”。

    Notification system(通知系统)
    odoo中的通知系统通过以下的组件实现:
    1、Notification widget: 这是一个简单的 widget,用来显示期望显示的信息。
    2、NotificationService: 一种服务,其职责是在请求完成时创建和销毁通知(使用自定义_事件)。请注意,web client是服务提供者.
    3、客户端动作display_notification: 允许从python触发并显示一个通知 (单击一个按钮).
    4、an helper function in ServiceMixin: displayNotification

    Displaying a notification(显示一条通知)
    显示通知的最常见方式是使用来自ServiceMixin的方法:
    displayNotification(options):
    通过下面的选项显示一个通知:
    title: 字符型, 可选项.作为标题显示在上方.
    subtitle: 字符型, 可选项.作为子标题显示在上方.
    message: 字符型, 可选项. 通知的具体内容.
    sticky: [ˈstɪki],布尔型, 可选项(默认值是false),此值如果为 true, 通知一直停留直到手工关掉它,否则,经过几秒自动关闭。
    type: 字符型,可选项 (默认值是 ‘warning’). 通知的类型. 可能的值: ‘info’, ‘success’, ‘warning’, ‘danger’, ‘’.
    className: 字符型,可选项. 自动应用于通知的css类. 这对于渲染通知的样式很有用,只是不鼓励使用它。
    messageIsHtml: 布尔型, 可选项(默认值是false). 允许传递html消息. 注意:强烈反对使用,在启用此选项之前,应考虑其他选项。如果启用此选项,则调用者有责任正确转义消息.
    通过两个例子来说明如何使用:

    // 通过调用_t来保证文本正确被翻译.
    this.displayNotification({
        title: _t("Success"),
        message: _t("Your signature request has been sent.")
    });
    this.displayNotification({
        title: _t("Error"),
        message: _t("Filter name is required."),
        type: 'danger',
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    python中的例子:

    // 通过调用_(string)来保证文本正确被翻译.
    def show_notification(self):
        return {
            'type': 'ir.actions.client',
            'tag': 'display_notification',
            'params': {
                'title': _('Success'),
                'message': _('Your signature request has been sent.'),
                'sticky': False,
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    Systray(任务栏)
    在这里插入图片描述
    任务栏显示在ODOO界面的右上方,用来显示一些widget,如通知消息等。
    当SystrayMenu 被menu创建时,它将查找所有已经注册的小组件并作为子widget添加到合适的位置。
    目前没有针对systray系列widget的特定API。它们应该是简单的小部件,可以像使用trigger_up方法的其他小部件一样与其环境通信.
    增加一个新的任务栏项目
    没有systray注册表. 添加widget的正确方法是将其添加到类变量SystrayMenu.items中.

    var SystrayMenu = require('web.SystrayMenu');
    
    var MySystrayWidget = Widget.extend({
        ...
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    SystrayMenu.Items.push(MySystrayWidget);
    
    • 1
    Ordering(排序)
    
    • 1

    在将widget添加到之前,Systray菜单将根据 sequence属性对它们进行排序。如果原型上不存在该属性,则将使用50。因此,要将systray项定位在右侧,可以设置一个非常高的序列号(相反,设置一个较低的数字将其放置在左侧)。

    MySystrayWidget.prototype.sequence = 100;
    
    • 1
  • 相关阅读:
    matlab展示两个向量之间的差异
    C# 常用功能整合-1
    1600*A. Linova and Kingdom(DFS&优先队列&贪心)
    Maven进阶实战
    如何看待 30 岁学云计算,转行做云计算运维这件事?
    每日一题:合并两个有序数组
    Git分布式版本控制工具(一)
    自建or用SaaS|ToB企业如何玩转官网数字化改造
    vue3瀑布流布局(使用 Vue 3 框架的单文件组件格式(Single-File Component)编写的)
    [附源码]计算机毕业设计JAVA教室用电控制系统
  • 原文地址:https://blog.csdn.net/weixin_44565926/article/details/125967685