我正在尝试从客户端JavaScript设置XPages范围变量。我有一个XPage,其中包含使用Dojo显示或隐藏的几个部分。在这个XPage上,我有一个执行一些服务器端JavaScript的按钮。一旦按钮后面的SSJS执行,默认情况下可见的XPage部分再次可见,而不是在单击按钮之前可见的部分。我希望在按钮被点击之前可见的部分在按钮后面的SSJS执行后也可见。
为此,我考虑使用范围变量 - 使用客户端JavaScript来计算当前可见的XPage的哪个部分,在范围变量中设置此值并读取onClientLoad
中的范围变量XPage的事件再次使该部分可见(并隐藏所有其他部分)。
但是,我发现无法从客户端JavaScript设置范围变量。我试过添加
var xyz = "#{javascript:viewScope.put('sectionDisplay','Section')}"
到按钮的onClick
客户端事件,但无论是否单击该按钮,都会设置范围变量。
在XPage之前,我会使用查询字符串将变量从一个页面传递到另一个页面。我现在该怎么做?
答案 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>