【问题标题】:jqGrid - form editing issuesjqGrid - 表单编辑问题
【发布时间】:2013-04-01 12:25:23
【问题描述】:

在内联编辑中,在进行编辑之前,它会在内部创建一个数组 (savedRow) 并用可编辑字段的值填充它,以便我可以访问这些值。

我想知道在表单编辑中是否有类似的东西,因为我需要在编辑完成之前访问字段的值,以便在字段“保存”在数据库。

有人可以帮助我吗?


已编辑:

我在这里发布了我的代码的一部分(一个字段的代码),并且我正在尝试以两种方式进行验证(内联编辑和表单编辑)。对于内联编辑,我正在使用dataEvents 进行验证,并且我正在使用savedRow 访问尚未存储的数据。但是,由于使用了 savedRow,当我尝试使用表单编辑进行编辑时,它向我显示一个错误:savedRow is not defined。在这个领域的情况下,editrules 符合我想要做的,但我不知道这是否会发生在所有这些领域。

{ name: 'ac_fd', index: 'ac_fd', width: 50, editable: true,
  formatter: 'number', editrules: { number:true, required:true, minValue: 0.1,
  maxValue: 1.0 }, formatoptions: { decimalPlaces: 1, decimalSeparator: '.'},
     editoptions: {
        dataEvents: [ {
           type: 'blur', fn: function(e) {                        
              var savedrow  = $("#list").getGridParam('savedRow');
              console.log($(this).val());
              if($(this).val() != savedrow[0]['ac_fd']) {         
                 var eid='#' + savedrow[0]['id'] + '_ac_fd';   
                 var val_fd=$(this).val();
                 var fd_min=0.1;
                 var fd_max=1.0;

                 if( isNaN(val_fd) || val_fd > fd_max || val_fd < fd_min) {
                       setTimeout(function(){
                       $(eid).focus().select();
                    },600);


                    $(eid).qtip({
                       content: {
                          text: 'Fator de Demanda deve ser um <b>número</b>
                                 entre <b>' + fd_min.toFixed(1) + '</b> e <b>'
                                 + fd_max.toFixed(1) + '</b>.',
                          title: {
                             text: 'Atenção:',
                             button: true
                          }
                       },
                       show: {
                          event: false,

                          ready: true,

                          effect: function() {
                             $(this).stop(0, 1).fadeIn(400);
                          },

                          delay: 0,
                                                     },
                       hide: {
                          event: false,

                          effect: function(api) {
                             $(this).stop(0, 1).fadeOut(900).queue(function() {
                                 api.destroy();
                             });
                          },
                       },
                       style: {
                          classes: 'qtip-red qtip-rounded trif_tip_err',
                          tip: {
                             width: 10,
                             height:12
                          } 
                       },
                       position: {
                          my: 'bottom left',  
                          at: 'top center',
                       },

                       events: {
                          render: function(event, api) {
                             tip_timer.call(api.elements.tooltip, event);
                          }
                       }
                    });  

                 }       
              }        
           }           
        } ]            
     }                   
  },

那么如果dataEvents 很常见并且用于三种编辑形式,我在哪里可以进行这种类型的验证(也使用qtip,我希望这种验证也用于内联编辑)?

【问题讨论】:

    标签: jqgrid form-editing


    【解决方案1】:

    jqGrid之所以将编辑行保存在区间savedRow参数中是因为jqGrid 修改编辑行就地。只是因为那个内联编辑和单元格编辑使用了间隔savedRow 参数。表单编辑在编辑完成之前不会修改原来的网格行。所以表单编辑不使用savedRow参数。

    如果表单已关闭或服务器响应将包含一些错误 HTTP 代码,则用户输入的新数据将不会保存在网格中。所以简单的服务器端验证通常就足够了。如果你想实现额外的客户端验证,你可以使用editrules 功能。 Custom validation 通常就足够了。它可以帮助验证表单的一个字段。如果您需要在验证期间比较表单的多个字段(如果一个字段的值定义了另一个字段的有效值),则另外使用 beforeCheckValues 回调。

    更新:在fn 事件处理程序中,您可以测试它是否会在表单编辑中被调用。有很多方法可以做到这一点。例如你可以测试$(e.target).closest(".FormGrid").length &gt; 0。如果它是真的,那么事件就在形式之内。此外,重要的是要了解当前编辑行在服务器上成功保存之前不会更改。因此,您可以随时使用getGridParam"selrow" 选项来获取编辑行的id,您可以使用getRowDatagetCell 在修改开始之前从网格中获取数据(与savedrow 相同) .

    【讨论】:

    • 感谢您的回复 :) 嗯,我以为表单编辑就像内联编辑一样工作,但现在我明白了。非常感谢@Oleg! :)
    • @mailazs:不客气! jqGrid 的一个大问题是它包含许多重复或接近的代码,但同一事物的实现不同。内联编辑、单元格编辑和表单编辑只有createElbindEvcheckValues等常用功能的一部分(来自the module。最主要的工作是三种编辑模式的不同实现 i>.
    • Huuumm 我认为他们可以考虑在所有三种模式中实现主要功能,就像在这种情况下......他们可以实现一些允许您在提交表单之前逐个字段验证的东西。这将非常有帮助。 :) 我在进行这些验证时遇到了一些问题,因为我使用dataEvents 进行内联编辑验证,而在dataEvents 中我使用的是savedRow,所以当我'我打算使用表单编辑 :( 你有什么建议给我吗?
    • @mailazs:我在回答中写了关于editrules 功能的文章。这是验证数据的主要方法。使用dataEvents 定义的事件可以控制keydown 并拒绝例如数字。
    • 我看到了这个,但我使用的是dataEvents 中的savedRow,当我尝试使用表单编辑进行编辑时,它向我显示了一个错误,即savedRow 未定义。我的意思是即使有了这个,我可以继续使用dataEventssavedRow,然后使用editrules 进行其他验证吗?
    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多