2014-03-13 2 views
1

목표는 N 행과 M 열로 편집 가능한 HTML 표를 사용하는 것입니다. 그래서 나는 하나의 행의 모든 ​​요소를 ​​편집 가능한 것으로 표시하고 다른 행은 간단한 outputText로 유지하는 솔루션을 제안합니다. 지금까지 행의 정확한 ID를 알고 있다면 숨겨진 필드를 표시 할 수 있습니다. 거기에 문제가 있습니다 ... JSF가 자체 ID를 생성하고 N (불특정 다수) 행을 가지고 있음을 알기 때문에 ID를 알지 못합니다. JSF2에서 JQuery를 사용하여 단일 행의 요소를 표시합니다.

은 (Primefaces도 통합)

<h:panelGroup id="table" layout="block" styleClass="ui-datatable ui-widget bearbeiten-ergebnisse__tabelle"> 
    <table> 
     <thead> 
     <tr> 
     <th class="ui-state-default"> 
      <h:outputText value="Editieren" /> 
     </th> 
     <ui:repeat 
      var="column" value="#{AuswahlBean.selectedMetaDataVersionColums}"> 
      <th class="ui-state-default"> 
      <h:outputText value="#{func:getColumnNameSplit(column.header)}" escape="false"/> 
      </th> 
     </ui:repeat> 
     </tr> 
     </thead> 
     <tbody class="ui-datatable-data ui-widget-content"> 
     <ui:repeat id="rowTable" 
      var="rows" value="#{AuswahlBean.selectedMetaDataVersionResultSet}"> 
      <tr 
       id="#{component.clientId}" 
       class="ui-widget-content clickable-row"> 
       <td class="row-operation"> 
        <h:outputText styleClass="ui-row-edit" value="edit" /> 
        <h:outputText styleClass="ui-row-save hide-field" value="save " /> 
        <h:outputText styleClass="ui-row-cancel hide-field" value="cancel" /> 
       </td> 
       <ui:repeat 
       var="column" value="#{AuswahlBean.selectedMetaDataVersionColums}"> 
       <td> 
        <!-- Zelleninhalt, der nicht-editierbar ist --> 
        <h:outputText 
         value="#{rows[column.property]}" 
         styleClass="ui-outputfield" 
         rendered="#{column.typeText}"/> 
        <h:outputText 
        value="#{rows[column.property]}" 
        styleClass="ui-outputfield" 
        rendered="#{column.typeNumeric}" > 
        <f:converter converterId="DwhNumberConverter"/> 
        </h:outputText> 
        <h:outputText 
        value="#{rows[column.property]}" 
        styleClass="ui-outputfield" 
        rendered="#{column.typeDate}"> 
        <f:converter converterId="DwhDateConverter"/> 
        </h:outputText> 

        <!-- Zelleninhalt, der nicht-editierbar ist --> 
        <p:inputText 
         rendered="#{column.typeText}" 
         value="#{rows[column.property]}" 
         styleClass="hide-field" 
         required="true" 
         requiredMessage="Überprüfungsfehler: Eine Eingabe wird erwartet."/> 
        <p:inputText 
         rendered="#{column.typeNumeric}" 
         value="#{rows[column.property]}" 
         styleClass="hide-field" 
         required="true" 
         requiredMessage="Überprüfungsfehler: Eine Zahl wird erwartet." 
         converter="DwhNumberConverter"> 
         <p:ajax event="valueChange" async="TRUE" 
         update="@this :theForm:msg" /> 
        </p:inputText> 
        <p:calendar 
         rendered="#{column.typeDate}" 
         value="#{rows[column.property]}" 
         styleClass="calendar-inputfield hide-field" 
         pattern="dd.MM.yyy" 
         required="true" 
         requiredMessage="Ein Datum wird erwartet. Bitte geben Sie in Datum im Format tt.mm.jjjj an." 
         converter="DwhDateConverter"> 
         <p:ajax event="valueChange" async="TRUE" 
         update="@this :theForm:msg"/> 
        </p:calendar> 
       </td> 
       </ui:repeat> 
      </tr> 
     </ui:repeat> 
     </tbody> 
     </table> 
     </h:panelGroup> 

그리고 여기에 자바 스크립트 snipet 내 JSF/HTML 코드입니다.

<script type="text/javascript"> 
    // Show the editable Row 
    $('.ui-row-edit').click(function(event){ 
    var editableRowId = $(this).closest('tr').attr('id'); 
    var fixedIdForJquerySelector = editableRowId.replace(/\:/g, '\\\\:'); 

    showInputFields(fixedIdForJquerySelector); 
    }); 
    function showInputFields(rowID) { 
    alert(rowID); 
    $("#"+rowID+" .ui-outputfield").css("color","red"); 
    /* $('#' + rowID + ' .ui-inputfield').removeClass('hide-field'); 
    $('#' + rowID + ' .calendar-inputfield').removeClass('hide-field'); 
    $('#' + rowID + ' .ui-outputfield').addClass('hide-field'); 
    $('#' + rowID + ' .ui-row-edit').addClass('hide-field'); 
    $('#' + rowID + ' .ui-row-save').removeClass('hide-field'); 
    $('#' + rowID + ' .ui-row-cancel').removeClass('hide-field'); */ 
    } 

    </script> 

ID 표현식은 jQuery 선택기로 허용되지 않습니다. 정확히 말하면, 콜론 뒤에 오는 것이 (정규 표현식 : '에서) CSS 의사 클래스로 읽혀지고 있다는 것입니다. 다음은 파이어 폭스 콘솔의 오류 메시지입니다 :

Error: Syntax error, unrecognized expression: unsupported pseudo: rowTable\

사람이 정규 행동은 기대 할 수도 있지만 내가 대신

$("#theForm\\:rowTable\\:0 .ui-outputfield").css("color","red"); 

같은 동일한 선택 (ID)를 하드 코딩하는 경우

$("#"+rowID+" .ui-outputfield").css("color","red"); 

원하는 동작을 얻습니다.

그리고 포인트를 얻으려면 : ) 누가 선택기가 작동하지 않는지 아는 사람이 있습니까? b) 변환기를 포함하여 단일 행을 편집 할 수있는 다른 솔루션이 있습니까?

미리 감사드립니다.

솔루션

@Denish에 의한 도움으로 jQuery를-솔루션입니다. row-ID가 jQuery 선택기로 받아 들여지지 않는 이유는 아직도 모르지만 (배경 지식 만 있다면 어떤 힌트일까요?).

$('.ui-row-edit').click(function(event) { 
     var editableRow = $(this).closest('tr'); 
     showInputFields(editableRow); 
    }); 

    function showInputFields(rowObject) { 
     rowObject.find('.ui-inputfield').toggleClass('hide-field'); 
     rowObject.find('.ui-outputfield').toggleClass('hide-field'); 
     // and so on for all necessary CSS-classes 
    } 
+0

는 u는 특정 행의 모든 ​​TD에 대한 고유 ID를 했는가는 @Dinesh 처음에 내가 설정하지 않은 – Dinesh

+0

또는 태그에 대한 모든 ID. 태그의 경우 clientID를 사용하여 원하는 행을보다 쉽게 ​​제어 할 수있었습니다. 그러나 ID를 설정하지 않은 해결책이 있다면 매우 감사하겠습니다. 반면에 솔루션이 태그의 ID를 사용한다면 JSF가이 작업을 수행하는지 확인하거나 태그'id = "# {component.clientId}"와 동일한 솔루션을 사용할 수 있습니다. – njsmecho

+0

k 친구 나는 당신의 질문을 이해할 수 없지만 사용자가 td를 클릭하면 텍스트 상자를 보여 주어야하고 값이 맞을 수도 있습니다. – Dinesh

답변

1

HTML 코드 (DEMO : http://jsbin.com/vacul/1/edit)

<table> 
    <tr> 
     <td class="Bover"></td> 
     <td class="Orun"></td> 
     <td> 
      <input type="button" value="EDIT" class="Bedit" /> 
     </td> 
    </tr> 
</table> 

는 JQUERY :

$(document).ready(function() { 

    $('.Bedit').click(function() { 
    var dad = $(this).parent().parent(); 
    var btnvalue = $(this).val(); 
    if (btnvalue == "EDIT") { 

     var data = dad.find('.Bover').text(); 
     var data1 = dad.find('.Orun').text(); 

     dad.find('.Bover').text(''); 
     dad.find('.Orun').text(''); 


     dad.find('.Bover').append('<input type="text" class="hide" name="BOvers" value='+ data +' />'); 
     dad.find('.Orun').append('<input type="text" class="hide" name="BRuns" value='+ data1 +' />'); 

     $(this).val('NEXT'); 
    } 
    else { 
     var Bover = dad.find('[name="BOvers"]').val(); 
     dad.find('.Bover').text(Bover); 
     var Orun = dad.find('[name="BRuns"]').val(); 
     dad.find('.Orun').text(Orun); 

     dad.find('.hide').hide(); 

     $(this).val('EDIT'); 
    } 
    }); 
}); 
+0

고마워요. 내게 속임수를 보여 줬어. jQuery 함수'find ([selector]) '덕분에 나는 그것을 끝낼 수있다. 덕분에 다시 친구, 2 일간의 작업을 마침내 해결할 수 있습니다 ;-) 나는 내 질문에 나의 최종 해결책을 게시합니다. – njsmecho

+0

나는 jQuery 함수'children ([selector]) '을 사용하여 거의 혼자 해결책을 찾았지만 1 단계 하위 클래스 ( - tags)에서 클래스를 찾았습니다. 분명히하기 위해'rowObject.children(). children ('.ui-inputfield') 대신'rowObject.children ('.ui-inputfield'). removeClass ('hide-field')'를 사용했습니다. ('hide-field')'를 사용합니다. 나는 어린이 - 함수가 DOM 트리의 모든 자식을 검색 할 것이라고 생각했습니다. 위의 솔루션이 더 우아한 솔루션 일지라도 그 솔루션은 다른 사람들을 도울 것입니다. – njsmecho

+0

죄송 합니다만 투표 할 수는 없습니다. 평판이 누락되었습니다. – njsmecho

관련 문제