【问题标题】:Dynamic Render Formula in XPages MenuXPages 菜单中的动态渲染公式
【发布时间】:2016-05-12 14:17:29
【问题描述】:

我在 XPages 中创建了一个计算菜单,其中包含基于用户角色呈现的规则。 我的菜单的值是根据计算字段中的视图计算得出的。 这是我的菜单代码:

<div id='cssmenu'>
<ul><li class='active has-sub'>
<a href='#'>Title1</a>
<ul>
<xp:text escape="true" disableTheme="true" contentType="html">
<xp:this.value>
<![CDATA[#{javascript:var arr= @DbColumn(@DbName(), "vwMenu", 4);
arr.join("");}]]>
</xp:this.value>
</xp:text>
</ul>
</li>
</ul>
</div>

我的数组中的一个元素的值给出了例如这个代码:

<li class='has-sub'>
<a href=https://mylink.com>Link1</a>
<xp:panel>
<xp:this.rendered>
<![CDATA[${javascript:context.getUser().getRoles().contains('[USER1]')}]]>
</xp:this.rendered>
<ul>
  <li><a href=https://MyPage.com>Link2</a></li>
 </ul>
</xp:panel>
</li>

菜单看起来很好,所以 html 代码没问题。但是关于 link2 上的可见性的 xml 部分没有。链接 2 不可见,无论连接用户的角色如何。我认为这是我在 javascript 代码中使用 xml 代码时发生的问题。 可能是因为我的计算域的内容类型是html,而我的渲染代码是xml。

【问题讨论】:

    标签: javascript html xml xpages lotus-domino


    【解决方案1】:

    您忘记用撇号 ' 括起来 href 属性:

      <li class='has-sub'>
                <a href='https://mylink.com'>Link1</a>
                <xp:panel>
                    <xp:this.rendered>
        <![CDATA[${javascript:context.getUser().getRoles().contains('[USER1]')}]]>
                    </xp:this.rendered>
                    <ul>
                        <li>
                            <a href='https://MyPage.com'>Link2</a>
                        </li>
                    </ul>
                </xp:panel>
            </li>
    

    【讨论】:

    • 菜单在 url 中有或没有撇号都有效。只有当我根据用户角色设置渲染规则时它才起作用。
    【解决方案2】:

    方法.contains() 区分大小写。确保 ACL 中设置的角色正好是 [USER1]。你渲染的代码对我来说很好。

    您可以在渲染代码中添加一些打印以用于测试目的:

            <xp:this.rendered>
                <![CDATA[${javascript:
                    print(context.getUser());
                    print(context.getUser().getRoles());
                    context.getUser().getRoles().contains('[USER1]')}]]>
            </xp:this.rendered>
    

    您可以在服务器控制台看到代码中真正发生的情况:

    href 值必须用引号或单引号括起来。否则,您会收到语法错误,并且您在 XPage 上所做的更改不会生效。

    更新

    正如您在 cmets 中提到的,您将 HTML 和包含的 JavaScript 代码放入计算字段中。这不起作用,因为内容直接发送到浏览器,并且这种方式包含的 JavaScript 代码不会在服务器上执行。

    改为使用重复控件来创建菜单项:

    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view
        xmlns:xp="http://www.ibm.com/xsp/core">
        <ul>
            <li>
                <a href="https://mylink.com">Link1</a>
                <xp:panel>
                    <xp:this.rendered>
                        <![CDATA[${javascript:
                            context.getUser().getRoles().contains('[USER1]')}]]>
                    </xp:this.rendered>
                    <ul>
                        <xp:repeat
                            var="link">
                            <xp:this.value><![CDATA[#{javascript:
                                ["https://MyPage.com", "https://www.google.com"]
                            }]]></xp:this.value>
                            <li>
                                <a href="#{link}">
                                    <xp:text escape="true"
                                        value="#{javascript:'Link to ' + link}" />
                                </a>
                            </li>
                        </xp:repeat>
                    </ul>
                </xp:panel>
            </li>
        </ul>
    </xp:view>
    

    【讨论】:

    • 感谢您的回答。当我在浏览器中检查我的菜单代码时,我看到渲染部分已被注释。通常渲染规则不会出现在源代码中,因为它必须由服务器解释。
    • 即使我添加了打印,当我检查源代码时它们也会被注释掉。我在控制台上没有打印。
    • 我用一个正常工作的 XPage 更新了我的代码。从那里去。
    • 谢谢。当我直接在菜单 XPage 中插入源代码时,渲染已正确完成。问题是我使用计算域来构建从视图中恢复值的菜单。这些值是我的菜单的元素,由用户设置并以表单(标签、渲染、菜单标题和 URL)计算。当我恢复这个计算代码并将其插入到我的源代码中时,它运行良好。除了必须计算我的菜单。我认为计算字段运行的是 html 部分,而不是里面的 javascript。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多