【问题标题】:Show (make editable) Elements of a single Row with JQuery in JSF2在 JSF2 中使用 JQuery 显示(使可编辑)单行的元素
【发布时间】:2014-04-18 02:43:35
【问题描述】:

我的目标是创建一个包含 N 行和 M 列的可编辑 HTML 表格。因此,我想提供一个解决方案,将 ONE 行的所有元素显示为可编辑,而其他行保持为简单的 outputText。到目前为止,如果我知道行的确切 ID,我可以显示隐藏字段。还有一个问题...我不知道 ID,因为您知道 JSF 会生成自己的 ID,而且我确实有 N(不特定数量)行。

这是我的 JSF/HTML 代码(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>

这里是 JavaScript 代码段。

    <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 伪类。以下是firefox控制台的错误信息:

错误:语法错误,无法识别的表达式:不支持的伪:rowTable\

如果我像这样硬编码相同的选择器 (ID),有人可能会认为这是常规行为

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

而不是

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

我会得到想要的行为。

直奔主题: a) 有谁知道为什么选择器不起作用? b) 有没有人有其他解决方案来编辑​​包括转换器在内的单行?

提前致谢!

解决方案

@Denish 帮助下的 jQuery 解决方案。 尽管我仍然不知道为什么行 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
    }

【问题讨论】:

  • 你是否对特定行中的每个 td 都有唯一的 id
  • @Dinesh 最初我没有为 或 标签设置任何 ID。对于 -标签,我使用 clientID 来更简单地控制所需行。但是,如果有没有设置 ID 的解决方案,我将不胜感激。另一方面,如果您的解决方案依赖于 -tags 的 ID,那么您可以确定 JSF 会执行此操作,或者我使用与 -tag id="#{component.clientId}" 相同的解决方案。
  • k 朋友我无法理解你的问题,但我很厚,而用户可以点击 td 然后你需要显示文本框并捕获值可能我是对的
  • @Dinesh 部分你是对的。如果用户点击一行(或行中的一个元素),整行应该是可编辑的(显示输入字段),捕获新值,转换并验证它们,最后保存所有。
  • 只做一件事你隐藏输入类型字段,而用户点击你可以显示文本框你想要这个代码

标签: jquery html jsf-2 primefaces


【解决方案1】:

HTML 代码(演示: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>

查询:

$(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');
    }
  });
});

【讨论】:

  • 谢谢您的先生,您向我展示了诀窍。在 jQuery-function find([selector]) 的帮助下,我可以完成它。再次感谢朋友,经过 2 天的工作,我终于有了一个解决方案;-) 我在我的问题下面发布了我的最终解决方案。
  • 我几乎自己用 jQuery-function children([selector]) 找到了解决方案,但我犯了一个错误,我在 1st level child (-tags) 中寻找类。为了清楚起见,我使用了rowObject.children('.ui-inputfield').removeClass('hide-field') 而不是rowObject.children().children('.ui-inputfield').removeClass('hide-field')。我认为 children 函数会搜索 DOM 树的所有子节点。尽管上面的解决方案更优雅,但也许该解决方案会对其他人有所帮助。
  • 你现在还没有得到解决方案
  • 你现在还没有得到解决方案是什么意思?我几天前将您的答案标记为解决方案...
猜你喜欢
相关资源
最近更新 更多
热门标签