我添加了一些小部件容器(从扩展程序库中)到应用程序,以显示用户的收藏夹,应用程序特定内容和最受欢迎的文档列表。
虽然我设法限制每个窗口小部件容器中显示的项目数,但我还希望将各个窗口小部件容器的状态保存在会话范围变量中,因此各个框的状态可以沿其他页面传递。我的问题是,没有任何事件似乎陷入了关闭" /"开放"小部件中的操作。
我的问题是:这有可能吗?如果是os,我怎样才能实现这一目标?
像往常一样,感谢您的帮助
到目前为止代码:
<xp:this.data>
<xp:dominoView var="viewToolbox"
viewName="ToolboxByProvLangDept">
<xp:this.categoryFilter><![CDATA[#{javascript:if(!!sessionScope.lang) {
sessionScope.lang;
} else {
"FR";
}}]]></xp:this.categoryFilter>
</xp:dominoView>
</xp:this.data>
<xe:widgetContainer id="widgetContainer1" titleBarText="Toolbox"
style="padding-left:0.0px;padding-right:0.0px" collapsible="true">
<xp:repeat id="repeat1" value="#{viewToolbox}" var="rowVar"
rows="#{javascript:AppConfig.nbWidgetToolbox}">
<xp:link escape="true" id="link1">
<xp:this.value><![CDATA[#{javascript:"/page.xsp?action=openDocument&documentId=" + rowVar.getColumnValue("LinkUNID");
}]]></xp:this.value>
<xp:this.text><![CDATA[#{javascript:try {
var doc:NotesDocument = database.getDocumentByUNID(rowVar.getColumnValue("LinkUNID"));
return @LowerCase(doc.getItemValueString("Subject"));
} catch (e) {
return "-subject unavailable-";
}}]]></xp:this.text>
</xp:link>
<hr />
</xp:repeat>
</xe:widgetContainer>
</xp:view>
答案 0 :(得分:2)
您可以在客户端端捕获窗口小部件的打开/关闭状态更改。
在客户端添加 onclick 事件以打开/关闭扭曲并启动对不可见面板的部分刷新&#34; widgetStatus&#34;这将写出当前状态&#34; open&#34;或者&#34;关闭&#34;以id作为名称的会话范围变量。
<xp:eventHandler
event="onClientLoad"
submit="false">
<xp:this.script><![CDATA[
dojo.query(".lotusSection2").forEach(function(nodeWidget) {
var id = nodeWidget.id;
dojo.query(".lotusTwistyClosed", nodeWidget).forEach(function(node) {
dojo.connect(node, "onclick", function() {
XSP.partialRefreshGet("#{id:widgetStatus}", {
params: {'status': 'open', 'id' : id}
});
});
});
dojo.query(".lotusTwistyOpen", nodeWidget).forEach(function(node) {
dojo.connect(node, "onclick", function() {
XSP.partialRefreshGet("#{id:widgetStatus}", {
params: {'status': 'closed', 'id' : id}
});
});
});
});
]]>
</xp:this.script>
</xp:eventHandler>
<xp:panel
id="widgetStatus">
<xp:this.rendered><![CDATA[#{javascript:
if (param.status) {
sessionScope.put(param.id, param.status);
}
return true;
}]]></xp:this.rendered>
</xp:panel>
然后,您可以计算小部件&#34; initClosed&#34;属性取决于widgetContainer的会话范围变量id:
<xe:widgetContainer id="widgetContainer1" titleBarText="Toolbox"
style="padding-left:0.0px;padding-right:0.0px" collapsible="true"
initClosed="#{javascript:
var status = sessionScope.get(getClientId(this.id));
status ? status === 'closed' : false}">
如果先前的窗口小部件状态已关闭,它将被关闭,否则将打开。
这适用于主题OneUI V3.0.2。
<强>更新强>
这是主题OneUI V2.1 / OneUI V2.1 / OneUI V2 / OneUI的修改后的eventHandler版本:
<xp:eventHandler
event="onClientLoad"
submit="false">
<xp:this.script><![CDATA[
dojo.query(".lotusWidget2").forEach(function(nodeWidget) {
var id = nodeWidget.id;
dojo.query(".lotusArrow", nodeWidget).forEach(function(node) {
dojo.connect(node, "onclick", function() {
XSP.partialRefreshGet("#{id:widgetStatus}", {
params: {'status': (node.id.match("_open$") ? 'closed' : 'open'), 'id' : id}
});
});
});
});
]]></xp:this.script>
</xp:eventHandler>
答案 1 :(得分:1)
我对代码进行了一些修改,因为小部件的ID在应用程序中使用的某些xpages上有所不同。我决定使用每个小部件的ID作为范围变量的名称,因此它们将始终相同。
为了实现这一点,我改变的第一件事是widgetStatus面板。面板的代码现在看起来像这样:
<xp:panel id="widgetStatus">
<xp:this.rendered><![CDATA[#{javascript:if (param.status) {
var tmp = param.id.split(":");
sessionScope.put(tmp[tmp.length-1], param.status);
}
return true; }]]></xp:this.rendered>
<xp:label
value="This cc contains the logic to keep the widgets' states in sessionScope variables."
id="label1" rendered="false" style="color:rgb(255,0,0)">
</xp:label>
</xp:panel
我修改了sessionScope中保存的变量名。
此更改的第二部分是每个窗口小部件的“initClosed”属性中使用的代码,以查看它是否最初打开或关闭。这是代码现在的样子:
var status = sessionScope.get(this.id);
status==='closed' ? true : false;
这样,如果您的窗口小部件的ID是widetPanel1,则会话范围变量名称将是widgetPanel1,它将包含窗口小部件的状态。
这个小小的改变就像一个魅力,即使小部件的客户端ID因任何原因而改变。
希望这会对别人有所帮助!再次感谢克努特,我会试着看看你是否有亚马逊愿望清单;)