xpages:扩展库小部件容器关闭时的陷阱
xpages: trap when extension library widget container is closed
我已将一些小部件容器(来自扩展库)添加到应用程序以显示用户的收藏夹、应用程序特定内容和 most 流行文档列表。
虽然我设法限制了每个小部件容器中显示的项目数量,但我还想将各种小部件容器的状态保存在 session 范围变量中,因此各个框的状态可以是沿着其他页面传递。我的问题是似乎没有事件会在小部件中捕获 "close"/"open" 操作。
我的问题是:pos真的是兄弟吗?如果 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>
您可以在 客户端 端捕获小部件的 open/closed 状态变化。
在客户端添加一个 onclick 事件到 open/close 扭曲并启动对不可见面板的部分刷新 "widgetStatus" 这将写入当前状态 "open" 或 "closed" 以 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>
然后,您可以根据 widgetContainer 的 id 的会话范围变量计算小部件的 "initClosed" 属性:
<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}">
如果之前的widget状态为关闭状态则关闭,否则为打开状态
这适用于主题 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>
我对代码进行了一些修改,因为小部件的 ID 在应用程序中使用的某些 xpage 上有所不同。我决定使用每个小部件的 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 出于某种原因发生了变化,这个小改动也很有用。
希望这对其他人有所帮助!再次感谢克努特,我会看看你是否有亚马逊愿望清单 ;)
我已将一些小部件容器(来自扩展库)添加到应用程序以显示用户的收藏夹、应用程序特定内容和 most 流行文档列表。
虽然我设法限制了每个小部件容器中显示的项目数量,但我还想将各种小部件容器的状态保存在 session 范围变量中,因此各个框的状态可以是沿着其他页面传递。我的问题是似乎没有事件会在小部件中捕获 "close"/"open" 操作。
我的问题是:pos真的是兄弟吗?如果 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>
您可以在 客户端 端捕获小部件的 open/closed 状态变化。
在客户端添加一个 onclick 事件到 open/close 扭曲并启动对不可见面板的部分刷新 "widgetStatus" 这将写入当前状态 "open" 或 "closed" 以 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>
然后,您可以根据 widgetContainer 的 id 的会话范围变量计算小部件的 "initClosed" 属性:
<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}">
如果之前的widget状态为关闭状态则关闭,否则为打开状态
这适用于主题 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>
我对代码进行了一些修改,因为小部件的 ID 在应用程序中使用的某些 xpage 上有所不同。我决定使用每个小部件的 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 出于某种原因发生了变化,这个小改动也很有用。
希望这对其他人有所帮助!再次感谢克努特,我会看看你是否有亚马逊愿望清单 ;)