0

嗨,我正在附上我的代码,我的问题是我正在从数据库中获取一个列表,并且我在一个只有复选框的数据表中显示 UI。

一旦用户选择任何复选框,那么我需要在该复选框的文本区域上呈现。所以 checkbox 和 textarea 将是动态的。

我也在 bean 中编写了一些代码,但这不适用于第一个对象,它工作正常,但对于剩余的对象,它不起作用,请帮助解决问题

豆码:

public void addSharedMessage()
{   
    for(DocumentTypeDTO documentTypeDTO1 : shareGovtAgencyList)
{
    System.out.println(documentTypeDTO1.getSelected());
    if( documentTypeDTO1.getSelected())
        {
        this.setSharedMessageRendered(true);
        setSharedMessageRendered(true);             
    } else {
        this.setSharedMessageRendered(false);
    }
}
}

XHTML 代码:

<rich:dataTable width="100%" id="searchResult" border="0" rowKeyVar="
    value="#{myBean.sharedList}" var="item"
    headerClass="head" cellpadding="2" 
    rowClasses="odd,even" cellspacing="0" bgcolor="#FFFFFF">

    <rich:column  style="text-align:center; background-color:#FFFFFF" width="1%">
     <h:selectBooleanCheckbox  id="khudh" value="#{item.selected}" immediate="true" >
         <a4j:support event="onchange" action="#{myeBean.addSharedMessage}"                              reRender="committeemenbersname" />
         </h:selectBooleanCheckbox>                            
    </rich:column>
    <rich:column  style="background-color:#FFFFFF" id="committeemenbersname" >
     <h:outputText value="#{item.documentName}" />
     <rich:separator lineType="none" />
         <h:inputTextarea id="shareProfileComment" rows="2" cols="45"  
              rendered="#{myBean.isSharedMessageRendered}"  >
             <f:validateLength maximum="200" />
         </h:inputTextarea> 
    </rich:column>
 </rich:dataTable>

确保在非 Angular 代码执行之后调用 $digest

我有一个 UI 组件,$watch它的宽度有回调(原因与这篇文章无关)。问题是在某些情况下:

  • 宽度从非角度上下文改变->
  • 没有$digest循环->
  • 我的$watch回调没有被调用

尽管我的应用程序是一个完整的 Angular 应用程序,但仍然存在代码在非 Angular 上下文中执行的情况。例如:JQuery 调用window.setTimeout- 所以即使我的代码JQuery是从角度上下文中调用的,超时回调也会在非角度上下文中调用,并且$watch之后不会执行我的回调。

顺便说一句,即使是棱角分明的自己也会打电话给window.setTimeout他们AnimatorService......

所以我的问题是:如何确保在$digest执行任何代码后始终执行循环?(即使代码是第 3 方代码......)

我考虑过覆盖原始window.setTimeout方法,但是:

  • 感觉有点丑陋和危险。
  • 恐怕它不会涵盖所有用例。

添加一个plunker。plunker 样本包含:

  • 可以使用 JQueryfadeOut方法隐藏的元素。
  • 执行fadeOut隐藏元素调用的按钮。
  • 显示元素显示状态的文本(Shown!!!Hidden!!!)。此文本通过$watch对元素display属性进行 ing 更新。
  • 一个按钮,除了启动一些角度代码之外什么都不做,以便$digest调用一个循环。

流动:

  • 单击Fade Out按钮 -> 元素将被隐藏但状态文本将保留Shown!!!。您现在可以永远等待 - 或者:
  • 单击Do Nothing按钮-> 文本会突然改变。

为什么?

单击Fade Out按钮时JQuery.fadeOut调用该window.setTimeout方法。之后我的$watch回调被调用,但元素仍然没有隐藏。该元素仅在调用超时回调后才隐藏 - 但是没有$digest循环(而且我无法知道触发一个)。只有在下次运行角度代码时,我的$watch函数才会被再次调用并且状态会被更新。

4

1 回答 1

0

不要每次都迭代所有值。你做的任何一个值为真,其余的都应该是假的。我认为这是问题所在。

尝试这个,

public String addSharedMessageAction()
    {
        DocumentTypeDTO documentTypeDTO1 = shareGovtAgencyList.get(dataTableIndex);
        System.out.println(documentTypeDTO1.getSelected());
        if (documentTypeDTO1.isSelected())
        {
            documentTypeDTO1.setSharedMessageRendered(true);
        }
        else
        {
            documentTypeDTO1.setSharedMessageRendered(false);
        }
        return null;
    }

XHTML 代码:

   <rich:dataTable id="dataTableID"
                 value="#{Sample.sampleList}"
                 rendered="#{Sample.sampleDataTableRendered}"
                 var="sampleBean"
                 width="600"
                 rowKeyVar="currentIndex">

                 <f:facet name="header">
                   <rich:columnGroup>
                       <rich:column>
                           <h:outputText value="select"/>
                       </rich:column>

                       <rich:column>
                           <h:outputText value="Comment"/>
                       </rich:column>
                    </rich:columnGroup>
                 </f:facet>

                 <rich:column >
                    <h:selectBooleanCheckbox id="checkboxId" 
                         value="#{sampleBean.selected}">
                         <a4j:support action="#{Sample.addSharedMessageAction}"
                              event="onclick" reRender="dataTableID">
                                <a4j:actionparam name="actionParemId"
                                       value="#{currentIndex}"
                                       assignTo="#{Sample.dataTableIndex}"/>
                         </a4j:support>
                    </h:selectBooleanCheckbox>
                </rich:column>

                <rich:column >
                     <h:inputTextarea value="#{sampleBean.comment}"
                                rendered="#{sampleBean.isSharedMessageRendered}"/>
                </rich:column>

        </rich:dataTable>
于 2013-06-25T01:23:01.373 回答