XPages SSJS行动小组

时间:2017-06-26 09:03:01

标签: xpages xpages-ssjs

我点击按钮时有一个操作组。第一个动作,做一些验证,第二个动作抛出一个确认(你想保存吗?)如果是的话,第三个动作就会消失并做其他一些事情。

我遇到的问题是,如果第一次操作验证失败,我不希望其他2个操作运行,所以我不会得到确认等。

如果验证失败,我已经尝试过休息,并且返回false,但似乎都不起作用。我确定我错过了一些明显的东西,并且患有星期一综合症,但我似乎无法解决这个问题!

下面的事件处理程序代码,谢谢:

'id' BG*11

更新1:操作组的条件代码:

direct_neighbor

4 个答案:

答案 0 :(得分:1)

保罗,我接受了你的答案,我做了更多的手动编码,因为这是我采取的方法。我正在提交答案,以便我可以使用代码格式显示我的解决方案....

我现在做我的验证客户端 - 获取孩子等的原因,是我动态创建/删除字段,这些字段显示为我的文本框的重复控件,所以我不知道元素id的.... / p>

var objcolparent = document.getElementById("ObjColOuter").children[0];
var sacolparent = document.getElementById("SAColOuter").children[0];
var rows = sacolparent.getElementsByTagName("TEXTAREA").length;

for (var i = 0; i < rows; i++) {
var saValue = sacolparent.getElementsByTagName("TEXTAREA")[i].value;
if(saValue ==""){
    var objValue = objcolparent.getElementsByTagName("TEXTAREA")[i].value;
    if(!objValue==""){
        // Validation failed, do client side bootalert
        var o = {};
        o.title = "Validation Failed";
        o.body = "You must enter self assessment details for each objective";
        o.alertIcon = "fa-thumbs-down fa-lg";
        o.alertType = "danger";
        bootAlert.show('alertServer',JSON.stringify(o))
        return false;
        break;
    }
}
}

if(confirm("Are you sure you want to submit your self assessment?")){
  return true;
}else{
  return false;
}

如果验证成功,则继续运行我的服务器端:

document1.replaceItemValue("rows",viewScope.rows);
document1.replaceItemValue("status","Self Assessment Completed");
document1.save();
var o = {}
o.title = "Document Saved";
o.body = "This document has been succesfully submitted";
o.alertIcon = "fa-thumbs-up fa-lg";
o.autoClose = true;
o.alertType = "success";
requestScope.put("alertServer",o)

感谢所有贡献的人!

答案 1 :(得分:0)

您可以向actionGroup添加条件。这是一个简单的例子:

<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
    <xp:this.action>
        <xp:actionGroup condition="#{javascript:myCondition()}">
            xp:confirm>
                <xp:this.message><![CDATA[#{javascript:"Are you sure you want to submit your self assessment?"}]]></xp:this.message>
            </xp:confirm>
            <xp:executeScript>
                ...
            </xp:executeScript>
        </xp:actionGroup>
    </xp:this.action>
</xp:eventHandler>

因此,在您的情况下,您只需将第一个操作添加为条件,并根据操作组中的逻辑是否必须运行而返回true或false。

答案 2 :(得分:0)

操作组对基本的最小编码操作很有用。但是,正如您所看到的,“更容易”的点击式,配置驱动的操作意味着灵活性更难。手动编码可能看起来更难,但更容易灵活。如果您对XPage进行确认操作,预览并查看源代码,它将告诉您需要使用哪种功能进行手动编码。大约七年前,当我查看XSP类时,我认为使用的函数是XSP.confirm(),等同于基本的JavaScript confirm()调用。使用它可以使您的代码更易读,并使灵活性更容易。

答案 3 :(得分:0)

有一个解决方案,但它涉及实现一系列元素以正确支持此方案。但是当它结束时,我相信它会非常有用。

您的问题与blog post of mine有些联系。 为了帮助您解决具体问题,我将在此总结所有可移动部件。希望你喜欢阅读...

第一个元素:服务器端帮助方法

如果您在验证阶段之外进行验证,那么没有真正的方法可以让客户知道出现了问题,或者更好,但是它会与您想要留在的最终流程断开连接(您的案件)。因此,您首先要做的是创建一种告诉客户的方法。首先,我们使用简单的辅助方法构建静态类:

public enum Helper {
    ;

    public static void setErrorHeader(HttpServletResponse response, PhaseId phaseId) {
        response.setHeader("Application-Error", phaseId.toString());
    }
}

我们稍后会调用此方法来标记&#34;标记&#34;验证失败

第二个要素:客户端辅助方法

我们需要一个JavaScript函数来帮助我们获取最终添加的响应头(通过JS库将此函数添加到XPage中)。

var helper = {
    isBadRequest : function(xhr) {
        return xhr.getResponseHeader("Application-Error") !== null;
    }
}

第3个元素:增强的事件处理程序

为了以正确的方式开始工作,我们必须利用事件处理程序参数:

<xp:button id="myButton" value="Three-step action">
    <xp:eventHandler
        id="myEventHandlerId"
        event="onclick"
        submit="false"
        action="#{myBean.makeItFlow}"
        script="threeStep('validate', 'threeStepSave(arguments[1].xhr)')"/>
</xp:button>

eventHandler将上面定义的属性定义为非常重要:

  • id:用于稍后在
  • 抓取事件处理程序
  • submit="false":我们不会提交表单,我们会手动执行
  • action:包含对将要调用的服务器端bean方法的引用。我使用了名字myBean.makeItFlow。我假设您知道如何使用托管bean
  • script:&#34; real&#34;行动发生

在脚本属性的这一点上,我们调用XPages客户端javascript方法来执行post XSP.partialRefreshPost() - 我们手动传递各种参数。在这种情况下,我选择避免将所有必要的脚本与事件一致。在页面底部,您可以添加以下帮助程序函数:

<xp:scriptBlock
    value="
    function threeStep(param, onCompleteFunc) {
        var execId = '#{id:containerId}';
        var refreshId = '#{id:containerId}';
        var eventHandlerId = '#{id:myEventHandlerId}';

        var opts = {
            execId: execId,
            params: { '$$xspsubmitid': eventHandlerId, action: param },
            onError : 'console.log(arguments[0])'
        };

        if (onCompleteFunc) {
            opts.onComplete = onCompleteFunc;
        }

        XSP.partialRefreshPost(refreshId, opts);
    }

    function threeStepSave(xhr) {
        if (helper.isBadRequest(xhr)) {
            return alert('Validation failed');
        }

        if (!confirm('Do you want to continue?')) return;

        threeStep('save');
    }" />

方法的第一个参数是将刷新的id。然后我们有一个属性定义的对象:

  • param:我们想要传递的参数,以便调整服务器端方法行为
  • onCompleteFunc:将在服务器端方法评估结束时调用的客户端javascript(js必须是字符串并将被评估)
  • var execId:将与POST一起提交的块(以及范围)
  • var refreshId:将刷新的块
  • var eventHandlerId:对事件处理程序ID
  • 的非常重要的引用

第4个元素:bean动作方法

现在,通过Java bean,我们定义了按钮背后的所有动作逻辑。我决定使用一个特定的方法来响应事件处理程序传递的action参数值。

public void makeItFlow() {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    String action = (String) externalContext.getRequestParameterMap().get("action");

    if ("validate".equals(action)) {
        // Your logic
        boolean failed = false;

        // When validation fails add the error response header
        if (failed) {
            HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
            Helper.setErrorHeader(response, PhaseId.INVOKE_APPLICATION);
        }
    } else if ("save".equals(action)) {
        // Let's save this thing
    }
}

我正在添加一个关于它应该如何表现的简短视频(在示例中我添加了一些额外的代码以使各个阶段变得明显)

https://youtu.be/JayzcGex-rQ