2013-04-11 68 views
1

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

要做到这一点,我想过使用范围变量 - 使用客户端JavaScript来计算当前可见的XPage的哪一部分,将该值设置为范围变量,并在onClientLoad事件中读取范围变量XPage再次使此部分可见(并隐藏所有其他部分)。 但是,我没有找到从客户端JavaScript设置范围变量的方法。我曾尝试加入

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

到按钮的onClick客户端事件,但不管按钮是否被点击或没有这台范围变量。

在XPages之前,我会使用querystring将变量从一个页面传递到另一个页面。我现在该怎么做?

回答

1

另一种方法:或许你根本不需要scope变量,如果你只是想隐藏某些东西,你可以将它的style属性设置为“display:none”。

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

然后你可以用下面的CSJS在一个按钮:

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

+1

是的,我使用dojo cookie解决了这个问题,而不是范围变量。在我的XPage中,我有几个Dojo内容窗格,其中只有一个是可见的。现在,当我使用dojo显示dojo内容窗格时,我使用dojo.cookie存储了窗格的名称。当XPages在按钮后面的SSJS执行后重新加载时,我使用XPage的onClientLoad事件中的dojo.cookie来确定应该显示哪个Dojo内容窗格。 – 2013-04-11 13:48:20

+0

@TonyGuiheen嗯,有趣的想法:-)饼干在SSJS中可用作饼图。 – 2013-04-16 21:18:23

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 ...

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

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

param.get("value"); 
5

取决于你的使用情况。如果你想与部分/完全刷新设置,你可以简单地把隐藏编辑成XP,将其绑定到anyScope.variable_name并设置其与CSJS值:

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

每次刷新会提交其价值进行建模和会在范围变量中可用。

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

+0

只是为了提醒您:只适用于表单的编辑模式。隐藏输入在读取模式下呈现为“span”,并且未提交任何值。要解决此问题,请将隐藏的输入置于其属性为'readOnly = false'的Panel组件中。 – 2016-06-29 13:42:29

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

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

param.get("value"); 

我传递一个UNID从网格到对话框。我可以得到param.get('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>