2017-11-03 5 views
2

私は、繰り返しコントロールを介してJavaオブジェクトのarraylistをレンダリングするカスタムコントロールを構築しました。プロパティ定義を介して、表示したいJavaオブジェクトのフィールドを指定することができます。バックエンドでは、この値を読み取りました。カスタムコントロールのプロパティ定義を介してレンダリング関数を渡します

obj[compositeData.columnField1] 

を経由してこれは静的データとうまく動作しますが、時々私は、例えば、レンダリングの前にフォーマットしたいですフィールドにnotesnameが含まれていて、私はcommonnameを表示したいだけです。

私はそのようなものをどのように設定できるのだろうかと思っています。

フィールド名を渡すだけで、ccが値を読み取るようになります。

など。 jQuery DataTablesプラグインでは、列のレンダリング関数を定義し、その列のデータ変数をそのレンダリング関数内で使用できます(たとえば、その列にアンカーリンクまたはボタンを作成するなど)。

SSJSと同様のものを提供できますか?私はテキスト(またはオブジェクト?)としてレンダリング関数を渡し、バックエンドではssjsに変換されます。

答えて

0

JavaScriptの関数は、オブジェクトの一番上の市民です。すべてのレンダリング関数を使用してJSオブジェクトを作成し、そのオブジェクトをスコープの1つに格納したとします。例えば。 viewScope.renderFunctions。私はstackoverflowの上ここに答えを見つけたトリック

+0

また、関数自体をオブジェクト型のパラメータに渡すこともできます – stwissel

0

を行う必要があります

var renderfunc = viewScope.renderFunctions[funcname]; 
    var result = renderfunc(rawdata); 
     return result; 

:次にレンダリング機能の使用など何かの内部名を引き渡します。私のボタンのEventHandlerは、以下のようになります。

<property> 
     <property-name>action</property-name> 
     <property-class>javax.faces.el.MethodBinding</property-class> 
     <property-extension> 
      <designer-extension> 
      <editor>com.ibm.workplace.designer.ide.xfaces.internal.editors.MethodBindingEditor</editor> 
      </designer-extension> 
     </property-extension> 
     <description>ssjs that action button must perform</description> 
     </property> 

は、クラスや編集者が、上記のようにしていることを確認してください:私のカスタムコントロールの

<xp:eventHandler event="onclick" submit="true" 
      refreshMode="partial" refreshId="pnlContainer" 
      action="#{javascript:if (compositeData.actionButton.action) if (!compositeData.actionButton.action.call()) return;}"> 
     </xp:eventHandler> 

は、私はプロパティを設定しています。

そして、カスタムコントロールを含むのXPageのプロパティはSSJSが含まれています

action="#{javascript:removeSelected}" 

これはSSJSスクリプトライブラリ内に存在する機能です。ここでの鍵は括弧のいずれかのパラメータを提供することではありません(!!!)

続くようSSJS関数は次のとおりです。

function removeSelected(){ 
    var accessList = sessionScope.get("removalList"); 
    var nsf_committee = datasources["COM1_DB_FILEPATH"];   
    var db:NotesDatabase = session.getDatabase(session.getServerName(), nsf_committee); 
    for (var i = 0; i < accessList.length; i++) { 
     var doc:NotesDocument = db.getDocumentByUNID(accessList[i]); 
     if (null != doc){ 
      doc.remove(true); 
      accessList.remove(accessList[i]); 
     } 
    } 
} 

(ここではIデータベースから文書を削除したIDのUNIDは、ANに存在します。配列リストは、繰り返しコントロール内の各行のチェックボックスグループを介して設定されます)。

0

あなたのアプリの多くのコンテキストでコンポーネントを再利用したいと考えているので、ヘルパークラスインターフェース

public class FieldManager { 

    public static interface FieldDetail { 
    String getName(); 
    void getAction(); 
    } 

    private List<FieldDetail> fieldDetails = new List<FieldDetail>(); 

    public FieldManager() { 

    } 

    public FieldManager(List<FieldDetail> fieldDetails) { 
    this.fieldDetails.addAll(fieldDetails); 
    } 

    public void addFieldDetail(FieldDetail fieldDetail) { 
    this.fieldDetails.add(fieldDetail); 
    } 

    public List<FieldDetail> getFieldDetails() { 
    return fieldDetails; 
    } 

} 

この簡潔な定義では、FieldDetailインターフェイスを汎用クラスまたは別の特殊クラスで実装できるようになりました。

次にあなたがvalueまたは何としてプロパティを設定するカスタムコントロールでは、<property-class>タグはFieldManagerになり、カスタムコントロールに使用すると、すべてがクラスFieldManagerFieldDetailので出て再生する方法を知っているだろうが、あなたのための契約です。

<xp:repeat disableOutputTag="true" 
     value="#{compositeData.value.fieldDetails}" var="fieldDetail"> 
    <xp:link text="#{fieldDetail.name}"> 
     <xp:eventHandler event="onclick" submit="true" 
       refreshMode="partial" refreshId="pnlContainer" 
       action="#{fieldDetail.action}"> 
     </xp:eventHandler> 
    </xp:link> 
</xp:repeat> 

あなたのコードが何であってもかまいません。とにかく、それはそれの要点です。

関連する問題