xpages:关闭扩展库窗口小部件容器时的陷阱

时间:2015-01-29 20:58:17

标签: xpages xpages-extlib

我添加了一些小部件容器(从扩展程序库中)到应用程序,以显示用户的收藏夹,应用程序特定内容和最受欢迎的文档列表。

虽然我设法限制每个窗口小部件容器中显示的项目数,但我还希望将各个窗口小部件容器的状态保存在会话范围变量中,因此各个框的状态可以沿其他页面传递。我的问题是,没有任何事件似乎陷入了关闭" /"开放"小部件中的操作。

我的问题是:这有可能吗?如果是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>

2 个答案:

答案 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因任何原因而改变。

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