You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 20:12:56