Xpages 重复控件中按钮的计算样式类

Xpages 重复控件中按钮的计算样式类,xpages,xpages-ssjs,Xpages,Xpages Ssjs,我在一个xp:repeat控件中有一个xp:button控件。我想计算按钮的styleClass属性,因此我通过向styleClass添加“active”来确定单击了哪个按钮 不幸的是,当我在viewScope变量中设置活动ID(所选按钮的ID)并将其与在styleClass中计算的ID进行比较时,它们会有所区别 区别在于viewScope中ID的值似乎包含一个额外的迭代器值,例如 视图:_id1:_id81:重复2:0:按钮2或 视图:_id1:_id81:重复2:1:按钮2 styleCla

我在一个xp:repeat控件中有一个xp:button控件。我想计算按钮的styleClass属性,因此我通过向styleClass添加“active”来确定单击了哪个按钮

不幸的是,当我在viewScope变量中设置活动ID(所选按钮的ID)并将其与在styleClass中计算的ID进行比较时,它们会有所区别

区别在于viewScope中ID的值似乎包含一个额外的迭代器值,例如

视图:_id1:_id81:重复2:0:按钮2或 视图:_id1:_id81:重复2:1:按钮2

styleClass中的计算值不是,例如

视图:_id1:_id81:重复2:按钮2

最后一个ID值与所有其他按钮相同

为了计算我使用的ID值:

getComponent(“button2”).getClientId(facesContext)

正如Tim Tripcony提到的


我做错了什么,或者如何在SSJS中正确计算styleClass属性?

您不能依赖于静态资源(如样式表)中的控件ID,因为这些ID总是经过计算的。在xpage中添加更多组件,所有控件都可能收到新ID。因此,我严格避免在样式表中使用ID

我不能100%确定我是否理解您在这里试图做什么,因此以下解决方案可能与您无关;我无论如何都要试试:

  • 尝试在css中使用伪标识符,如

    div.myRepeaterClass按钮:活动{无论如何;}

  • 使用包含中继器indexVar的计算样式类;为此,您为repeat控件的indexVar属性指定一个类似于rIndex的名称。然后可以将按钮的样式类呈现给

    styleClass=“#{javascript:“myBtnClass”+rIndex.toString()}”

  • 这样,您的按钮至少具有唯一的样式类

  • 这可能是最复杂的一个,以防其他控件不起作用:正如您所知,css还可以使用各种控件属性作为参考;假设您有一个带有标题属性的标准html元素,您的css可能是

    [title=myElementTitle]{无论如何;}

  • 对于Xpage控件,您可以使用generic attribute属性:对于大多数控件,您可以在“所有属性>>basics”下找到元素“attrs”。在这里,您可以添加自己的自定义属性-值对,然后可以从样式表中引用它们。如有必要,您可以编写一些onClick代码来操作该自定义属性。例如:

    使用值
    btnInactive
    创建自定义属性
    myRepeatBtn
    。然后编写JS代码,将该值更改为
    btnActive
    。您的css可以使用此选择器:

    [myRepeatBtn=btnActive]{whatever: however;}
    
    部分刷新将导致css对该更改作出反应

    希望这有点道理;)
    祝您好运。

    您不能依赖样式表之类的静态资源中的控件ID,因为这些ID总是经过计算的。在xpage中添加更多组件,所有控件都可能收到新ID。因此,我严格避免在样式表中使用ID

    我不能100%确定我是否理解您在这里试图做什么,因此以下解决方案可能与您无关;我无论如何都要试试:

  • 尝试在css中使用伪标识符,如

    div.myRepeaterClass按钮:活动{无论如何;}

  • 使用包含中继器indexVar的计算样式类;为此,您为repeat控件的indexVar属性指定一个类似于rIndex的名称。然后可以将按钮的样式类呈现给

    styleClass=“#{javascript:“myBtnClass”+rIndex.toString()}”

  • 这样,您的按钮至少具有唯一的样式类

  • 这可能是最复杂的一个,以防其他控件不起作用:正如您所知,css还可以使用各种控件属性作为参考;假设您有一个带有标题属性的标准html元素,您的css可能是

    [title=myElementTitle]{无论如何;}

  • 对于Xpage控件,您可以使用generic attribute属性:对于大多数控件,您可以在“所有属性>>basics”下找到元素“attrs”。在这里,您可以添加自己的自定义属性-值对,然后可以从样式表中引用它们。如有必要,您可以编写一些onClick代码来操作该自定义属性。例如:

    使用值
    btnInactive
    创建自定义属性
    myRepeatBtn
    。然后编写JS代码,将该值更改为
    btnActive
    。您的css可以使用此选择器:

    [myRepeatBtn=btnActive]{whatever: however;}
    
    部分刷新将导致css对该更改作出反应

    希望这有点道理;)
    祝你好运。

    我写下第一个答案后就回家了。在我的路上,我仔细考虑了这一点,认为我找到了一个相当简单的解决办法;由于我认为另一个答案中的一些想法有助于理解我的解决方案建议,所以我将其保留原样,并创建了这个新的解决方案。以下是您可以尝试的内容:

    向中继器的
    indexVar
    属性添加一个值,例如
    rIndex
    (您可以在所有属性下找到它)

    假设要激活某个按钮,用户必须单击该按钮,您可以向其onclick事件添加一些SSJS代码,如下所示,以便将当前indexVar值存储在requestScope变量中:

    requestScope.put("activeIndex", rIndex)
    
    确保onclick对包含repeat控件的容器执行部分刷新

    创建代码来计算重复按钮的样式类;如果repeat的迭代索引是存储在requestScope中的索引,则指定一个样式类,否则指定另一个:

    if(rIndex==requestScope.get("activeIndex")){
      "btnStyleActive";
    }else{
      "btnStyleInactive";
    }
    
    因为onclick部分刷新了转发器及其内容,所以应用了correctstyleClass

    我家里没有DominoDesigner,所以我不能尝试,但我觉得这一定行得通

    更新:刚刚构建了我自己的解决方案
    .btnStyleInactive{color:blue;}
    .btnStyleActive{color:red;};
    
    <xp:repeat
        id="repeat1"
        value="objList"
        var="obj">
        <span class="#{javascript:return (obj.Condition) ? 'class1' : 'class2';}">
            <xp:button
                value="obj.Name"
                id="button1"
                styleClass="btn">
                <xp:eventHandler
                    event="onclick" submit="true"
                    refreshMode="partial" refreshId="repeat1">
                    <xp:this.action>
                    ...
                    </xp:this.action>
                </xp:eventHandler>
            </xp:button>
        </span>
    </xp:repeat>
    
        ....
    .class1 .btn{
        text-align: left;
    }
    
    .class2 .btn{
        text-align: right;
    }
    
        ...