Jsf p:向导onnext不停止';导航';

Jsf p:向导onnext不停止';导航';,jsf,primefaces,wizard,Jsf,Primefaces,Wizard,当我使用p:wizard时,我为onnext属性使用一个自定义处理程序,该处理程序只是发出警报并返回false以测试行为 我从primefaces库中的wizard.js了解到,单击向导的“下一步”按钮时,应执行以下代码: next: function () { if (this.cfg.onnext) { var b = this.cfg.onnext.call(this); if (b == false) {

当我使用p:wizard时,我为onnext属性使用一个自定义处理程序,该处理程序只是发出警报并返回false以测试行为

我从primefaces库中的wizard.js了解到,单击向导的“下一步”按钮时,应执行以下代码:

next: function () {
        if (this.cfg.onnext) {
            var b = this.cfg.onnext.call(this);
            if (b == false) {
                return
            }
        }
        var a = this.cfg.steps[this.getStepIndex(this.currentStep) + 1];
        this.loadStep(a, false)
    } 
我的理解是:向导首先执行自定义处理程序,如果自定义处理程序返回false,则不应加载下一个选项卡(调用PrimeFaces.widget.wizard.loadStep)。但实际情况是,自定义处理程序被称为,然后被称为向导的PrimeFaces.widget.Wizard.loadStep函数,因此下一个选项卡是焦点


我的理解是错误的,还是这是PF中的错误?

只是做了一点检查,“顺序”是正确的,因此然后当您声明它没有错误时,问题是它无论如何被称为,即使您(认为)返回false

问题是:

this.cfg.onnext.call(this);
它总是返回
未定义的
。它在5.3到5.1、5.0和4.0中都失败了,所以我一开始认为它要么从未经过全面测试,要么在最近的浏览器中有所改变。但实际情况是,我们定义的函数(在我的例子中是demo)被包装在一个匿名函数中

function (){demo()}
没有返回值,所以不是

function (){return demo()}
没有“return”会导致它永远不会返回从函数返回的实际值,而是始终“undefined”

这让我想到,在
onnext=“demo()”
中只需添加返回。。。所以,让它
onnext=“return demo()”
et瞧,它能工作

请记住,这很容易使用javascript调试器进行调试,并且您始终可以重写函数以添加其他日志语句

我用以下代码进行了测试:

<html  xmlns:h="http://xmlns.jcp.org/jsf/html"
       xmlns:p="http://primefaces.org/ui"
       xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h:head />
<h:body>
<h:form id="form">

    <p:wizard onnext="demo()" flowListener="#{mailTemplateBean.onFlowProcess}">
        <p:tab title="Step 1"/>
        <p:tab title="Step 2"/>
        <p:tab title="Step 3"/>
        <p:tab title="Step 4"/>

    </p:wizard>

    <script>

    PrimeFaces.widget.Wizard.prototype.next = function() {
        if(this.cfg.onnext) {
            var value = this.cfg.onnext.call(this);
            console.log("Return: " + value + " function: " + this.cfg.onnext);
            if(value === false) {
                return;
            }
        }

        var targetStepIndex = this.getStepIndex(this.currentStep) + 1;
        if(targetStepIndex &lt; this.cfg.steps.length) {
            var stepToGo = this.cfg.steps[targetStepIndex];
            this.loadStep(stepToGo, false);
        }
    }

    function demo() {
        var bla = confirm("Sure?");
        console.log("Choosen: " + bla);
        return bla;
    }</script>

</h:form>
</h:body>
</html>

PrimeFaces.widget.Wizard.prototype.next=函数(){
if(this.cfg.onnext){
var value=this.cfg.onnext.call(this);
log(“返回:+value+”函数:+this.cfg.onnext);
如果(值===false){
返回;
}
}
var targetStepIndex=this.getStepIndex(this.currentStep)+1;
if(targetStepIndex this.cfg.steps.length){
var stepToGo=this.cfg.steps[targetStepIndex];
此.loadStep(stepToGo,false);
}
}
函数demo(){
var bla=确认(“确定?”);
console.log(“Choosen:+bla”);
返回bla;
}

请向PF提交一个问题,并要求他们将其添加到文档中,或者让他们修复其中的“包装”功能,添加automagic return。

PF版本?否则我可能是在追逐鬼魂,试图复制我使用的是Primefaces 5.2Tanks Kukeltje,这提供了信息,非常有用。你的工作也很有帮助。我会向PF问题追踪者报告。