1

情况如下:我有一个带有 3 种不同类型对象的树表。该表包含带有 event="select" 的 p:ajax。我写了 3 个不同的 contextMenus,每种类型一个......而且一切都很好。

我的问题是我想启用/禁用一些菜单项;为此,我根据所选节点的属性使用带有条件的“渲染”属性。一切正常,但只有第二次我右键单击同一个对象(第一次没有过滤 contextMenu)。

这是代码......(我只包括一种类型的对象)

树表页面:

<h:form id="form" prependId="false">
    <p:treeTable value="#{documentsController.root}" var="document" id="docs" 
            selectionMode="single" selection="#{documentsController.selectedNode}">

        <p:ajax event="select" process="@this" update=":form:menus"/>

        <p:column headerText="#{msg['name']}">
            <h:outputText value="#{document.name}" />
        </p:column>
    </p:treeTable>

    <h:panelGroup id="menus">
        <ui:include src="/menu/document_menu.xhtml"/>
    </h:panelGroup>

    <p:dialog id="document-rename-dialog" widgetVar="documentRenameDialog" header="#{msg.rename}">
        <h:panelGrid id="doc-rename" columns="2">
            <h:outputLabel for="name" value="#{msg.name}:" />
            <h:inputText id="name" value="#{documentsController.name}"/>
        </h:panelGrid>

        <div class="spacer-10" />

        <h:panelGroup layout="block">
            <p:commandLink onclick="documentRenameDialog.hide();" value="#{msg.cancel}"/>
            <p:commandLink actionListener="#{documentsController.renameDocument(documentsController.selectedNode.data)}"
            process="@this :form:document-rename-dialog:doc-rename"
            update=":form:docs"
            oncomplete="documentRenameDialog.hide();"
            value="#{msg.check}">
        </h:panelGroup>
    </common:dialog>
</h:form>

文档菜单页面:

<p:contextMenu id="contextMenuDocument" for="docs" nodeType="document">
    <p:menuitem value="#{msg.rename}" process="@this docs" update=":form:document-rename-dialog:doc-rename"
        actionListener="#{documentsController.setName(documentsController.selectedNode.data.name)}"
        rendered="#{documentsController.canWrite}"
        icon="ui-icon-pencil" oncomplete="documentRenameDialog.show();"/>
</p:contextMenu>

DocumentsController 类:

@ManagedBean
@ViewScoped
public class DocumentsController {
    private TreeNode root;
    private TreeNode selectedNode;
    private String name;

    public TreeNode getSelectedNode() {
        return selectedNode;
    }

    public void setSelectedNode(TreeNode selectedNode) {
        this.selectedNode = selectedNode;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void renameDocument(ArterDocument selectedDocument) {
        if(name != null && !name.equals("")) {
            System.out.println("Document renamed in: "+name);
            ((MyDocument)selectedNode.getData()).setName(name);
        }
        else
            addErrorMessage("Error renaming document.");
    }

    public static boolean canWrite() {
        if(((MyDocument)selectedNode.getData()).isWriteable())
            return true;
        return false;
    }
}

MyDocument 类是一个简单的类,带有一个字符串(名称)和一个布尔值(可写)。

谁能告诉我如何在第一次拍摄时显示过滤后的 contextMenu?

谢谢!

4

0 回答 0