为什么使用f:ajax(JSF)更新后,我的Materialize可折叠菜单不起作用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么使用f:ajax(JSF)更新后,我的Materialize可折叠菜单不起作用?相关的知识,希望对你有一定的参考价值。

我正在使用JSF 2.2和Materialize。当用户使用h:formh:commandButtonf:ajax标签发送一个基本表单时,我需要更新可折叠的动态列表。

这是用户发送的表单的代码:

<h:form>
    ...
    <h:commandButton value="send!" action="#{...}">
        <f:ajax render="@form pgMenu" execute="@form"/>
    </h:commandButton>
</h:form>

此代码表示要更新的菜单:

<h:panelGroup id="pgMenu">
    <ul class="collapsible myList">
        <h:panelGroup rendered="#{not empty bean.variable}">
            <li class="bold item-li"><a class="collapsible-header item-a">New</a>
                <div class="collapsible-body">
                    <ul>
                        <a href="page1.xhtml"><li class="li-izquierda">New 1</li></a>
                        <a href="page2.xhtml"><li class="li-izquierda">New 2</li></a>
                    </ul>
                </div>
            </li>
        </h:panelGroup>
        <li class="bold item-li"><a class="collapsible-header item-a">Fases</a>
            <div class="collapsible-body">
                <ul>
                    <a href="#"><li class="li-izquierda">Planeación</li></a>
                    <a href="#"><li class="li-izquierda">Otra mas</li></a>
                </ul>
            </div>
        </li>
        <li class="bold item-li"><a class="collapsible-header item-a waves-teal">javascript</a>
            <div class="collapsible-body">
                <ul>
                    <a href="#"><li class="li-izquierda">Collapsible</li></a>
                    <a href="#"><li class="li-izquierda">Dialogs</li></a>
                </ul>
            </div>
        </li>
    </ul>
</h:panelGroup>

我的问题是,当pgMenuis更新时,菜单js的行为会冻结。

下一个图像显示发送表单之前和之后的菜单(我点击选项)。

更新前

enter image description here

更新后

enter image description here

谢谢!

答案

每次更新后,您的DOM结构都在变化,因此您需要销毁以前的Collapsible类实例:

instance.destroy();

然后,在渲染新结构后,您需要重新初始化Collapsible:

var newElement = document.getElementById('YOUR_COLLAPSIBLE_CONTAINER');
var instance = new M.Collapsible(newElement, {YOUR OPTIONS});

当使用materialize-css库时,我担心这是你唯一的选择。

以上是关于为什么使用f:ajax(JSF)更新后,我的Materialize可折叠菜单不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

使用 f:ajax 时 JSF 不触发 bean setter

JSF 在 f:ajax 之后执行 javascript

是否可以使用 JSF ajax 更新非 JSF 组件(纯 HTML)?

JSF 复合组件 <f:ajax> 包含未知 id - 无法在组件的上下文中找到它

JSF 自定义组件:如何获取 <f:ajax /> 的属性

通过 Ajax 更新 JSF 组件后,JavaScript/jQuery 事件侦听器不起作用