2017-11-03 10 views
2

반복 컨트롤을 통해 Java 객체의 arraylist를 렌더링하는 사용자 정의 컨트롤을 만들었습니다. 속성 정의를 통해 표시 할 기본 Java 객체의 필드를 제공 할 수 있습니다. 백 엔드에서는이 값을 읽습니다. via사용자 정의 컨트롤의 속성 정의를 통해 렌더 함수 전달

obj[compositeData.columnField1] 

정적 데이터에서는 효과가 있지만 때로는 예전처럼 형식을 지정하려고합니다. 예 : 필드에 notesname이 들어 있고 공통 이름 만 표시하려고합니다.

내가 어떻게 그런 식으로 설정할 수 있는지 궁금합니다.

이제 필드 이름 만 전달합니다.이 필드 이름은 cc에서 값을 읽는 데 사용됩니다.

예. jQuery DataTables 플러그인의 경우 열에 대한 렌더링 함수를 정의하고 해당 렌더링 함수 내에서 해당 열의 데이터 변수를 사용할 수 있습니다 (예 : 해당 열에서 앵커 링크 또는 버튼 만들기).

SSJS와 비슷한 것을 제공 할 수 있습니까? 렌더링 함수를 텍스트 (또는 객체?)로 전달하고 백엔드에서 ssjs로 변환됩니다.

답변

0

JavaScript의 함수는 객체의 일등 시민입니다. 모든 렌더링 함수가있는 JS 객체를 생성하여 범위 중 하나에 저장했다고 가정합니다. 예 : viewScope.renderFunctions. I에 유래 여기에 대한 답을 발견 트릭

+0

개체 유형의 매개 변수에서 함수 자체를 넘길 수도 있습니다 – stwissel

0

을해야

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

: 그런 다음 렌더링 기능과 같이 사용 무언가 내 이름을 넘겨. 내 버튼의 이벤트 핸들러는 다음과 같이 보입니다 :

<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]); 
     } 
    } 
} 

을 여기에 내가 데이터베이스에서 문서를 제거 유니드 아이디의이에 상주 배열리스트는 반복 컨트롤의 각 행에 대한 체크 박스 그룹을 통해 설정됩니다.)

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 인터페이스를 일반 클래스 또는 대체 특수 클래스와 함께 구현할 수 있습니다.

그런 다음 사용자 지정 컨트롤에 당신은 <property-class> 태그가 FieldManager 될 것 value이든 같은 속성을 설정하고 사용자 지정 컨트롤에 당신은 클래스 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> 

또는 코드가 무엇이든간에. 어쨌든, 그것의 요지입니다.