首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XPages SSJS行动小组

XPages SSJS行动小组
EN

Stack Overflow用户
提问于 2017-06-26 09:03:01
回答 3查看 405关注 0票数 0

我有一个行动小组点击一个按钮。第一个操作,一些验证,第二个操作抛出一个确认(要保存吗?)如果是的话,第三个动作就开始了,并做了一些其他的事情。

我的问题是,如果第一个操作验证失败,我不希望其他两个操作运行,所以我应该没有得到确认等。

如果验证失败,我尝试过中断,返回为false,但两者似乎都不起作用。我肯定我错过了一些明显的东西,并且患有星期一综合症,但我似乎无法解决它!

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

代码语言:javascript
复制
        <xp:eventHandler event="onclick" submit="true"
        refreshMode="complete">
        <xp:this.action>
            <xp:actionGroup>

                <xp:executeScript>
                    <xp:this.script><![CDATA[#{javascript:for (var i = 1; i < viewScope.rows+1; i++) {
print("Starting Array.....");

var fieldName:string = "ObjectiveSelfAssessment" +i;
var fieldName2:string = "ObjectiveDetails" +i;
print ("Field Name: " + fieldName);

var fieldValue = document1.getItemValueString(fieldName);   
var fieldValue2 = document1.getItemValueString(fieldName2); 

print ("Field Value: " + fieldValue);
if (fieldValue =="" || fieldValue==null){
    print("Assessment Empty");
    if(!fieldValue2 =="" || !fieldValue2 == null){
        print("Objective Empty");
        //Do validation
        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.autoClose = true;
        o.alertType = "danger";
        requestScope.put("alertServer",o);
        //requestScope.put("validated",false);
        return false;
        break;
    }           
}
}
}]]></xp:this.script>
                </xp:executeScript>
                <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:this.script><![CDATA[#{javascript: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);
}]]></xp:this.script>
                </xp:executeScript>
            </xp:actionGroup>
        </xp:this.action>
    </xp:eventHandler>

更新1:行动组的条件代码:

代码语言:javascript
复制
<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
    <xp:this.action>
        <xp:actionGroup>
            <xp:this.condition><![CDATA[#{javascript:for (var i = 1; i < viewScope.rows+1; i++) {
print("Starting Array.....");

var fieldName:string = "ObjectiveSelfAssessment" +i;
var fieldName2:string = "ObjectiveDetails" +i;
print ("Field Name: " + fieldName);

var fieldValue = document1.getItemValueString(fieldName);   
var fieldValue2 = document1.getItemValueString(fieldName2); 

print ("Field Value: " + fieldValue);
if (fieldValue =="" || fieldValue==null){
    print("Assessment Empty");
    if(!fieldValue2 =="" || !fieldValue2 == null){
        print("Objective Empty");
        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.autoClose = true;
        o.alertType = "danger";
        requestScope.put("alertServer",o);
        print("FALSE");
        return false;
        break;
    }else{
        print("TRUE");
        return true;
    }               
  }
}
}]]></xp:this.condition>

            <xp:confirm>
                <xp:this.message><![CDATA[#{javascript:"Test11111"}]]></xp:this.message>
            </xp:confirm>
            <xp:executeScript>
                <xp:this.script><![CDATA[#{javascript: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);}]]></xp:this.script>
            </xp:executeScript>
        </xp:actionGroup>
    </xp:this.action></xp:eventHandler>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-26 12:15:30

操作组对于基本的、最小的编码操作非常有用。但是,正如你所看到的,“更容易”的点击点,配置驱动的操作意味着灵活性更难。手动编码看起来可能比较困难,但会使灵活性更容易。如果在XPage上放置确认操作,预览它并查看源代码,它将告诉您需要使用什么函数进行手动编码。大约七年前,当我查看XSP类时,我认为使用的函数是XSP.confirm(),相当于一个基本的JavaScript confirm()调用。使用它可以提高代码的可读性和灵活性。

票数 0
EN

Stack Overflow用户

发布于 2017-06-26 09:34:21

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

代码语言:javascript
复制
<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。

票数 0
EN

Stack Overflow用户

发布于 2017-06-28 11:50:47

有一个解决方案,但是它需要实现一系列的元素来正确地支持这个场景。但当它结束的时候,我相信它会很有帮助。

您的问题在某种程度上与我的博客文章有关。为了帮助你,在你的具体情况下,我将尝试总结这里所有的移动部分。希望你喜欢读书..。

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

如果您在验证阶段之外进行验证,就没有真正的方法让客户知道出了什么问题,或者更好的方法可能是错误的,但它将与您希望保留的最终流(您的情况)断开连接。因此,您首先要做的是创建一种告诉客户端的方法。首先,我们使用一个简单的助手方法构建一个静态类:

代码语言:javascript
复制
public enum Helper {
    ;

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

稍后,我们将调用此方法将验证“标记”为“失败”。

第二元素:客户端助手方法

我们需要一个JavaScript函数来帮助我们访问最终添加的响应头(通过JS库将这个函数添加到您的XPages中)。

代码语言:javascript
复制
var helper = {
    isBadRequest : function(xhr) {
        return xhr.getResponseHeader("Application-Error") !== null;
    }
}

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

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

代码语言:javascript
复制
<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:“真实”行动发生的地方

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

代码语言:javascript
复制
<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,我们定义了按钮后面的所有动作逻辑。我决定使用一个特定的方法,它将对事件处理程序传递的action参数值作出反应。

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44756212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档