xpages - 如何从客户端javascript设置范围变量?

时间:2013-04-11 08:24:52

标签: javascript variables scope xpages xpages-ssjs

我正在尝试从客户端JavaScript设置XPages范围变量。我有一个XPage,其中包含使用Dojo显示或隐藏的几个部分。在这个XPage上,我有一个执行一些服务器端JavaScript的按钮。一旦按钮后面的SSJS执行,默认情况下可见的XPage部分再次可见,而不是在单击按钮之前可见的部分。我希望在按钮被点击之前可见的部分在按钮后面的SSJS执行后也可见。

为此,我考虑使用范围变量 - 使用客户端JavaScript来计算当前可见的XPage的哪个部分,在范围变量中设置此值并读取onClientLoad中的范围变量XPage的事件再次使该部分可见(并隐藏所有其他部分)。 但是,我发现无法从客户端JavaScript设置范围变量。我试过添加

var xyz = "#{javascript:viewScope.put('sectionDisplay','Section')}"

到按钮的onClick客户端事件,但无论是否单击该按钮,都会设置范围变量。

在XPage之前,我会使用查询字符串将变量从一个页面传递到另一个页面。我现在该怎么做?

4 个答案:

答案 0 :(得分:6)

您不能以这种方式设置CSJS变量:如果您将此代码添加到CSJS,则会在发送到浏览器之前计算。这就是为什么设置变量而不管点击按钮。

但是你可以在按钮上添加一些SSJS代码来设置viewScope变量。您可以使用此处所述的参数从浏览器发送值:http://xpageswiki.com/web/youatnotes/wiki-xpages.nsf/dx/Work_with_events_and_partial_or_full_refresh#Run+a+partial+update+from+client+javascript

修改

您可以使用SSJS中的 param 对象访问不同的参数。 F.E.如果您在CSJS中添加参数 value ...

XSP.partialRefreshGet( id, {
    params: { 'value': 'some string'}
});

...你可以像这样访问SSJS中的参数:

param.get("value");

答案 1 :(得分:6)

取决于您的使用案例。如果你想用部分/全部刷新来设置它,你可以简单地将隐藏编辑放入XP,将其绑定到anyScope.variable_name并使用CSJS设置其值:

  var field = document.getElementById("#{id:hiddenInput1}");
  field.value = "new Value";

每次刷新都会将其值提交给模型,并且可以在范围变量中使用。

另一种选择是在SSJS的任何地方使用事件处理程序,根据隐藏的输入值或提交的值设置范围变量,如Sven的回答所述。

答案 2 :(得分:2)

另一种方法:也许您根本不需要范围变量,如果您只想隐藏某些内容,可以将其样式属性设置为“display:none”。

例如,你有这个div:<xp:div id="mydiv">...</xp:div>

然后您可以在按钮中使用以下CSJS:

dojo.byId("#{id:mydiv}").style.display="none"

答案 3 :(得分:1)

XSP.partialRefreshGet( id, {
    params: { 'value': 'some string'}
});

... you can access the parameter in SSJS like this:

param.get("value");

我正在将UNID从网格传递到对话框。我可以获得param.get(&#39; unid&#39;)但我无法将其设置为文档数据源unid。这样字段就会填充来自后端文档的值。有很多字段,所以我想以某种方式填充该数据源,而不必在每个字段中写入值。 如何让文档数据源识别param.unid?我正在尝试使用您描述的隐藏输入,但也未提交值。 这可能吗?

XSP.partialRefreshGet(dialogId,
{
    params: xspParams,
    onStart: function(){
        //dojo.style(loadingGifId,'display','block');
        XSP.getElementById("#{id:inputText1}").innerHTML = unid; //not working
        XSP.getElementById("#{id:inputText1}").value = unid; //not working either
    },
    onComplete: function(){
        dijit.byId(dialogId).show();
        //dojo.style(loadingGifId,'display','none');    
}});


<xp:panel id="dialog">
    <input id="inputText1"
        value="#{javascript:sessionScope.personUNID;}">
    </input>

    <xp:this.data>
        <xp:dominoDocument var="docPerson" action="editDocument"
            formName="fUserName">
            <xp:this.documentId><![CDATA[#{javascript:sessionScope.personUNID ;}]]></xp:this.documentId>
        </xp:dominoDocument>
    </xp:this.data>

    <xp:inputText id="cfParams"
        value="#{javascript:param.get('unid');}">
    </xp:inputText>
</xp:panel>