Odoo15:如何从服务端触发指定用户的JS模板重新渲染?
实现Owl模板定向重新渲染的方法
要实现调用Python函数时让特定用户的muk_web_theme.AppsBar模板重新渲染,核心是通过Odoo的bus.bus组件推送实时通知,配合前端Owl组件监听通知并触发更新。具体步骤如下:
1. Python端:发送定向实时通知
在你的Python类方法中,使用bus.bus的_sendone方法给目标用户推送更新信号(可附带更新后的计数器数据):
def trigger_apps_bar_refresh(self, user_id): # 可选:计算最新的消息计数器值 updated_counter = self._get_user_message_count(user_id) # 构造推送消息,type字段用于前端识别事件类型 message_payload = { 'type': 'apps_bar_counter_update', 'counter': updated_counter } # 发送给指定用户的专属频道,频道格式为'user_<用户ID>' self.env['bus.bus']._sendone( user_id, 'muk_web_theme.apps_bar_refresh', # 自定义频道名,需和前端对应 message_payload ) # 辅助方法:获取用户最新消息数(示例) def _get_user_message_count(self, user_id): return self.env['mail.message'].search_count([ ('res_partner_id', '=', self.env['res.users'].browse(user_id).partner_id.id), ('is_read', '=', False) ])
2. 前端Owl组件:监听通知并触发更新
修改muk_web_theme.AppsBar组件的代码,在setup方法中订阅对应的bus频道,收到通知后更新组件状态(触发自动重新渲染):
import { Component, useState } from '@odoo/owl'; export class AppsBar extends Component { setup() { super.setup(); // 初始化状态,存储计数器值 this.state = useState({ messageCounter: this.props.initialCounter || 0 }); // 订阅bus频道,监听推送的更新通知 this.env.bus.subscribe('muk_web_theme.apps_bar_refresh', this._handleRefresh.bind(this)); } _handleRefresh(payload) { // 更新计数器状态,Owl会自动触发组件重新渲染 this.state.messageCounter = payload.counter; // 如果不需要传递数据,直接调用forceUpdate强制渲染: // this.forceUpdate(); } } AppsBar.template = 'muk_web_theme.AppsBar';
3. 模板中绑定状态值
确保模板里的计数器使用组件的状态值:
<templates xml:space="preserve"> <t t-name="muk_web_theme.AppsBar" owl="1"> <div class="apps-bar-container"> <!-- 其他组件内容 --> <span class="message-counter" t-esc="state.messageCounter"/> </div> </t> </templates>
关键说明
bus.bus._sendone:定向给单个用户发送消息,第一个参数是用户ID,第二个是自定义频道名,第三个是消息内容。- 前端bus订阅:Odoo的web环境自带
bus实例,通过subscribe方法监听指定频道,收到消息后更新组件状态即可触发重新渲染。 - 状态管理:使用Owl的
useState管理计数器状态,状态更新时Owl会自动对比并重新渲染组件。
内容的提问来源于stack exchange,提问作者Wald Sin
相关产品推荐
相关产品推荐

