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 出于某种原因发生了变化,这个小改动也很有用。

希望这对其他人有所帮助!再次感谢克努特,我会看看你是否有亚马逊愿望清单 ;)