p:tree: 取消select事件

p:tree: cancel select event

如果某个条件为真,是否有办法在 primefaces p:tree 中取消节点的 select 事件?

我想显示一个对话框,如果用户选择 "cancel" 选项,则不应更改 selection。 我尝试从 p:ajax 调用 javascript 函数,但新节点无论如何都是 selected。

<p:ajax event="select" onstart="showDialog()"/>

我必须覆盖 Primefaces 树的默认行为吗?


PF6.2

如果您想取消请求,您需要在 onstart 中明确 return 一个 false

onstart="return false;"

将取消请求。这意味着您需要 return 来自 showDialog AND 的 true 或 false return 显式 return 该值在开始时。所以

onstart="return showDialog();"

您接下来的挑战是如何 'delay' 此 javascript 函数的 return 以便您可以提供用户操作的 return 值。

我终于想出了另一个解决方案:我已经覆盖了 'nodeClick' Primefaces VerticalTree 小部件,这样我就可以选择显示对话框或继续选择。

举个例子:

var param0, param1,param2;

function init() {
    PF('treeWidgetVar').nodeClick = function (b, a) {
        param0 = this;
        param1 = b;
        param2 = a;

        if(checkSomeCondition() == 'true'){
            showMyDialog();
            return;
        }else {
            PrimeFaces.widget.VerticalTree.prototype.nodeClick.call(this, b, a);
        }
    };
}

function doSelection(){
    PrimeFaces.widget.VerticalTree.prototype.nodeClick.call(param0, param1, param2);
}

我使用了 JQuery UI 确认对话框。如果用户单击 "Continue",我会使用 savad 参数进行选择,否则我会关闭对话框。

    $( function() {
        $( "#dialog-confirm" ).dialog({
            autoOpen: false,
            resizable: false,
            height: "auto",
            width: 400,
            modal: true,
            buttons: {
                "Continue": function() {
                    $( this ).dialog( "close" );
                    doSelection();
                },
                Cancel: function() {
                    $( this ).dialog( "close" );
                }
            }
        });
    } );

有点棘手,但似乎工作得很好。