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 ...;
    },
});

服务名字是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'
        });
    },
});

RPC
rpc 功能由 ajax 服务提供。

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

在 python 模型上调用方法:

return this._rpc({
    model: 'some.model',
    method: 'some_method',
    args: [some, args],
});

在这里插入图片描述

直接调用路由控制器:

return this._rpc({
    route: '/some/route/',
    params: { some: kwargs},
});

在这里插入图片描述
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',
});

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,
        }
    }

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

var SystrayMenu = require('web.SystrayMenu');

var MySystrayWidget = Widget.extend({
    ...
});
SystrayMenu.Items.push(MySystrayWidget);
Ordering(排序)

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

MySystrayWidget.prototype.sequence = 100;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值