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

如何将Stimulus JS控制器参数传递给Twig模板定义的模态窗口

问题

我有一个采购记录表格,点击任意采购项会显示详情和「批准采购」链接。点击「批准采购」时会弹出模态窗口,需要在窗口内完成采购状态变更操作。目前的问题是不知道如何将采购ID(row._id)传递到该模态窗口中。

相关代码片段

Twig模板

<div{{ attributes.add(stimulus_controller('purchases/purchases')) }}>
    {% set debounceMs = 'debounce(1000)' %}
    {% set foundCount = this.purchasesCount %}

    {% component 'bootstrap_modal' with {targetId: 'approve-purchase-modal'} %}
    {% block modal_header %}
{#            {{ dump(app.request) }}#}
    <div class="modal-header">
        <h6>Purchase approval #{{ purchaseId }}</h6>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
    </div>
    {% endblock %}
    {% block modal_body %}
        <div class="filter-wrap">
            <form id="approve-purchase-form" class="f-column">
                <div class="form-group center">
                    <button type="button" class="btn btn-primary btn-sm agree d-flex"
                            data-action="live#action"
                            data-live-action-param="prevent|approvePurchase"
                            data-live-index-param="{{ purchaseId }}"
                            data-bs-dismiss="modal"
                    >Approve
                    </button>
                </div>
            </form>
        </div>
    {% endblock %}
{% endcomponent %}

purchases_controller.js

window.detailFormatter = function (index, row) {
let html = []
html.push('<ul class="actions edit-actions ' + row._class + '">'
    +'<li><a class="blue" data-app-folder-type="purchase-detail" data-app-folder-title="'+row.desc+'" data-app-folder-id="'+row._id+'">Detail</a></li>'
    +'<li><a id="approve-purchase" title="" data-bs-purchase-id="'+row._id+'" data-bs-toggle="modal" data-bs-target="#approve-purchase-modal" data-toggle="tooltip" data-placement="top">'
    +'</ul>'
)
return html
}

请问如何处理data-bs-purchase-id="'+row._id+'",将其传递到Twig模板中作为purchaseId赋值给模态窗口?


解决方案

你可以通过Bootstrap模态框的事件监听机制来实现采购ID的传递,具体操作如下:

  • 监听模态框显示前的事件
    在你的Stimulus控制器(purchases/purchases)中添加事件监听,利用Bootstrap的show.bs.modal事件(模态框显示前触发)获取采购ID并更新模态内容:

    import { Controller } from '@hotwired/stimulus';
    
    export default class extends Controller {
        connect() {
            const modal = document.getElementById('approve-purchase-modal');
            modal.addEventListener('show.bs.modal', (event) => {
                // 获取触发模态框的"批准采购"链接元素
                const triggerElement = event.relatedTarget;
                // 提取链接上的采购ID
                const purchaseId = triggerElement.getAttribute('data-bs-purchase-id');
                
                // 更新模态框标题中的采购ID
                const modalTitle = modal.querySelector('.modal-header h6');
                modalTitle.textContent = `Purchase approval #${purchaseId}`;
                
                // 更新提交按钮的采购ID参数
                const approveButton = modal.querySelector('#approve-purchase-form .agree');
                approveButton.setAttribute('data-live-index-param', purchaseId);
            });
        }
    }
    
  • 调整Twig模板的默认值
    为了避免模板渲染时因purchaseId未定义报错,给它设置一个默认占位值:

    <h6>Purchase approval #{{ purchaseId ?? '0' }}</h6>
    

    按钮的参数也同步设置默认值,后续会被JS动态覆盖:

    data-live-index-param="{{ purchaseId ?? '0' }}"
    
  • 修复JS中的HTML语法错误
    原detailFormatter函数里的「批准采购」链接标签未闭合,补上闭合标签和按钮文本:

    window.detailFormatter = function (index, row) {
    let html = []
    html.push('<ul class="actions edit-actions ' + row._class + '">'
        +'<li><a class="blue" data-app-folder-type="purchase-detail" data-app-folder-title="'+row.desc+'" data-app-folder-id="'+row._id+'">Detail</a></li>'
        +'<li><a id="approve-purchase" title="" data-bs-purchase-id="'+row._id+'" data-bs-toggle="modal" data-bs-target="#approve-purchase-modal" data-toggle="tooltip" data-placement="top">Approve Purchase</a></li>'
        +'</ul>'
    )
    return html
    }
    

这个方案的核心逻辑是:当用户点击批准链接时,通过Bootstrap的模态框事件拿到触发元素上的采购ID,再动态替换模态框里的相关内容,无需提前在Twig模板中传递ID,完全通过前端JS实现动态赋值。


内容的提问来源于stack exchange,提问作者MartinC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:10:55