0

こんにちは、コードを添付しています。私の問題は、データベースからリストを取得していて、チェックボックスのみのデータテーブルで UI を表示しています。

ユーザーがチェックボックスのいずれかを選択したら、そのチェックボックスのテキスト領域にレンダリングする必要があります。したがって、チェックボックスとテキストエリアは動的になります。

私も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バックが呼び出されません

私のアプリケーションは完全な角度のアプリケーションですが、角度のないコンテキストでコードが実行される場合があります。例: JQuery 呼び出しwindow.setTimeout- 私のコードJQueryが angular コンテキスト内から呼び出されたとしても、タイムアウト コールバックは非 angular コンテキストで呼び出され、$watchその後コールバックは実行されません。

ちなみに、角度のあるものでさえ、自分自身を呼び出しwindow.setTimeoutますAnimatorService...

だから私の質問は:コードが実行された後にサイクルが常に実行されるようにするにはどうすればよいですか? $digest(コードがサードパーティのコードであっても...)

window.setTimeout元のメソッドをオーバーライドすることを考えましたが、

  • 少し醜く危険な感じです。
  • 残念ながら、すべてのユースケースをカバーするわけではありません。

プランカーを追加します。plunker サンプルには以下が含まれます。

  • fadeOutJQueryメソッドを使用して非表示にできる要素。
  • fadeOut要素を非表示にするための呼び出しを実行するボタン。
  • 要素の表示ステータスを示すテキスト (Shown!!!またはHidden!!!)。このテキストは、要素プロパティ$watchの ingによって更新されます。display
  • $digestサイクルが呼び出されるように角度コードを開始するだけのボタン。

フロー:

  • ボタンFade Outをクリック -> 要素は非表示になりますが、ステータス テキストは残りShown!!!ます。今すぐ永遠に待つことができます - または:
  • ボタンDo Nothingをクリック -> 突然テキストが変わります。

なんで?

Fade OutボタンをクリックするJQuery.fadeOutと、メソッドが呼び出されますwindow.setTimeout。その後、$watchコールバックが呼び出されますが、要素はまだ非表示になっていません。要素は、タイムアウト コールバックが呼び出された後にのみ非表示になりますが、$digestサイクルはありません (トリガーする方法がわかりません)。次回角度コードが実行されるときにのみ、$watch関数が再度呼び出され、ステータスが更新されます。

4

1 に答える 1