【问题标题】:Select a DynamicContent using a SessionScope variable使用 SessionScope 变量选择 DynamicContent
【发布时间】:2013-10-18 14:04:00
【问题描述】:

在 XPage 上,我有一个导航器,它根据所选项目设置 sessionScope 变量。然后我在 SwitchFacet 中使用该值来显示几个不同视图之一。这很好用,但我知道 switchFacet 会为所有视图加载整个树,其中作为 dynamicContent 控件仅加载所选面板的树。因此,我使用以下代码在 XPage 上的 panelAll 内创建了一个 dynamicContent 控件(Navigator 对 panelAll onClick 进行了部分重新释放):

<xp:panel id="panelAll" style="width:auto">
  <xe:dynamicContent id="dynamicContent1">
    getComponent("dynamicContent1").show(sessionScope.get("ssSelectedView");
    <xp:this.facets>
      <xp:panel xp:key="vwProfile">
        <xc:ccProfileView></xc:ccProfileView>
      </xp:panel>
      <xp:panel xp:key="vwPending">
        <xc:ccTransactionView></xc:ccTransactionView>
      </xp:panel>
      <xp:panel xp:key="vwAgentLog">
        <xc:ccAgentView></xc:ccAgentView>
      </xp:panel>

    </xp:this.facets>
  </xe:dynamicContent>
</xp:panel>

问题是视图不会像 switchFacet 那样改变。我知道 sessionScope 变量 id 设置正确,onClick 部分刷新应该刷新 panelAll 并选择要加载的不同面板,但它只显示 vwProfile 视图。我还需要做些什么来使动态内容正常工作吗?

【问题讨论】:

    标签: javascript xpages dynamic-controls


    【解决方案1】:

    不幸的是,dynamicContent 控件不适用于部分更新,只能完全重新加载页面。几个月前我尝试过同样的方法,但它也对我不起作用。

    我使用解决方法将我的“动态连接”部分放入自定义控件中,并使用它们的rendered 属性根据 sessionScope 变量的状态来显示它们。

    它并不完美,因为 XPages 引擎始终在其树中包含所有自定义控件的所有内容,但它适用于中等复杂的应用程序。

    【讨论】:

    • 我让 switchFacet 使用这种方法,但我认为我会转向 dynamicContent,因为它应该更有效,但完全刷新似乎也不是一个真正有效的过程。关于 switchFacet 和渲染面板之间的性能差异有什么想法吗?
    • 我刚刚构建了两个中等复杂的应用程序,每个应用程序只有一个 XPage 和大约 20-30 个自定义控件,这些控件根据带有部分更新的 sessionScope 变量呈现。一些控件包含注释视图,其他包含带有很多选项卡的表单等等。速度非常快,用户体验非常好。
    • 我正在使用动态内容。我将 getComponent().show 移动到导航器的 onClick 中,然后部分刷新工作。我的 onClick 这样做: getComponent("dynamicContent1").show(context.getSubmittedValue()); return sessionScope.put("ssSelectedView", context.getSubmittedValue());
    【解决方案2】:

    您必须致电dynamicContent.show("yourFacetName")。这种方式对我有用。我正在使用部分刷新(和部分执行模式),但我从方面内部调用.show()。我不知道这是否有区别。像这样的:

    <xe:dynamicContent id="dynamicContent1"
    defaultFacet="read">
     <xp:this.facets>
      <xp:panel xp:key="read">
       <xp:link>
        <xp:eventHandler event="onclick"
    submit="true" refreshMode="partial" refreshId="tableRow"
    execMode="partial" execId="tableRow">
         <xp:this.action><![CDATA[#{javascript:var c = getComponent("dynamicContent1");
    c.show("edit");}]]></xp:this.action>
        </xp:eventHandler>
       </xp:link>
      </xp:panel>
      <xp:panel xp:key="edit">
     </xp:this.facets>
    </xe:dynamicContent>
    

    【讨论】:

    • 酷,我不知道 :-)
    • 我认为问题在于您的 onClick 事件在 dynamicControl 内部,因为在我的示例中,我也在 dynamicContent 内部调用 getComponent().show(sessionScope) ,但部分刷新来自外部(即我的导航器)。正如朱利安所说,您似乎需要完全刷新才能刷新动态内容。
    • 因此,如果最终用户不打算在 this.facets 中采取任何行动,我看不出如何——就我而言——如何使用动态内容。 switchFacet 控件或在许多自定义控件上使用渲染属性可以工作,但它们都加载了我所理解的整个树,因此从这个角度来看它们并不是真正有效的。但他们工作!
    猜你喜欢
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多