2017-01-31 7 views
0

How to update value of data in jqgridで説明したソリューションを使用してデータをローカルに更新しました。それは最初のフィドルに示されているように私のために働いた。 「アクション」列には、「IsActive」列のデータに基づいて条件付きで追加されるボタンがあります。 「真」の場合は、「リタイア」ボタンがアクションとして追加されます。偽であれば、 "Activate"ボタンが追加されます。 javascript関数が呼び出されると、ボタンが "Activate"に変わります。今2つの列が同じフィールドを使用する場合、jqGridの値が更新されない

Fiddle 1

、私はテキストとしてステータス値を表示するには、別の列を追加しました。現在、「ステータス」列と「アクション」列の両方が同じデータ列を使用しています(IsActive)。この列を追加した後、javascript関数はボタンを "Retire"から "Activate"に変更していません。

Fiddle 2

この問題を修正するための最良の方法は何ですか?

CODE

$(document).ready(function() { 

function updateActiveStatus(rowid, isToActive) { 

alert('function'); 

         // first change the cell in the visible part of grid 
         $("#list").jqGrid('setCell', rowid, 'firstname', 'A'); 

         // now change the internal local data 
         $("#list").jqGrid('getLocalRow', rowid).firstname = 'A'; 


         $("#list").jqGrid('setCell', rowid, 'IsActive', false); 
         $("#list").jqGrid('getLocalRow', rowid).IsActive = false; 



      } 


      var myData = [ 

       { "id": "35", "firstname": null, "codeval": "G", "note": "xx7866", "amount": "23", "IsActive": true }, 
       { "id": "73", "firstname": null, "codeval": "W", "note": "dd1047", "amount": "34", "IsActive": true }, 
       { "id": "75", "firstname": "LORA", "codeval": "H", "note": "rr7323", "amount": "56", "IsActive": true }, 
       { "id": "95", "firstname": "EST", "codeval": "M", "note": "gg574", "amount": "55", "IsActive": true } 
       ], 

       myGrid = $("#list"); 

      myGrid.jqGrid({ 
       datatype:'local', 
       data: myData, 
       colNames: ['ID', 'FirstName', 'Code', 'Amount', 'Note', 'Action'], 
       colModel:[ 
        {name:'id',width:70,align:'center',sorttype: 'int'}, 
        {name:'firstname',width:80, align:'center'}, 
        { name: 'codeval', width: 70 }, 
        {name:'amount',width:100, formatter:'number'}, 
        {name:'note',index:'note',width:100,sortable:false}, 
        { 
         name: 'IsActive', 
         width: 100, 
         formatter: function (cellvalue, options, rowObject)             { 
          if (cellvalue == true) { 
           return '<div style="padding-left:5px;"><button class="ui-button ui-widget ui-state-default app-custom-button-retire" >' + 
             '<span title="" class="ui-button-icon-primary ui-icon ui-icon-scissors"></span>Retire' + 
             '</button></div>'; 
          } 
          else { 
           return '<div style="padding-left:5px;"><button class="ui-button ui-widget ui-state-default app-custom-button-activate" >' + 
             '<span title="" class="ui-button-icon-primary ui-icon ui-icon-check"></span>Activate' + 
             '</button></div>'; 
          } 
         } 
        } 
       ], 
       rowNum:10, 
       pager: '#pager', 
       gridview:true, 
       ignoreCase:true, 
       rownumbers:true, 
       viewrecords: true, 
       sortorder: 'desc', 
       height: '100%', 
       beforeSelectRow: function (rowid, e) { 
        var $self = $(this), 
         $td = $(e.target).closest("tr.jqgrow>td"), 
         rowid = $td.parent().attr("id"), 
         //rowData = $self.jqGrid("getLocalRow", rowid), 
         rowData = $self.jqGrid("getRowData", rowid) 
        iCol = $td.length > 0 ? $td[0].cellIndex : -1, 
        colModel = $self.jqGrid("getGridParam", "colModel"); 

        celValue = $self.jqGrid('getCell', rowid, 'FirstName'); 

        if (iCol >= 0 && colModel[iCol].name === "IsActive") { 

         if ($(e.target).hasClass("app-custom-button-retire")) { 
          updateActiveStatus(rowid,false); 
          return false; 
         } 

         if ($(e.target).hasClass("app-custom-button-activate")) { 

          updateActiveStatus(rowid, true); 
          return false; 
         } 
        } 


        //Avoid selection of row 
        return false; 
       } 
      }); 
      myGrid.jqGrid('filterToolbar', { stringResult: true, searchOnEnter: false, defaultSearch: "cn" }); 

     }); 

答えて

1

私はあなたのコード内の複数の誤解ようです。まず、何らかのソースデータがあります。これはアイテムの配列です。

{ "id": "75", "firstname": "LORA", "codeval": "H", "note": "rr7323", 
    "amount": "56", "IsActive": true } 

か、同じである、

{ id: "75", firstname: "LORA", codeval: "H", note: "rr7323", 
    amount: "56", IsActive: true } 

そのような項目が同じ名前と複数のプロパティを持つことができないことは明らかである:すべての項目は次のように、複数のプロパティを持つオブジェクトです。オブジェクトは、一部のウェブブラウザがエラーを無視することができても間違っているでしょう。

{ "id": "75", "firstname": "LORA", "codeval": "H", "note": "rr7323", 
    "amount": "56", "IsActive": true, "IsActive": true } 

を指定しても、両方の "IsActive"プロパティに同じtrueが指定されています。

同じ方法で、同じnameプロパティを持つ複数の列にcolModelを使用することはできません。あなたの2番目のデモhttps://jsfiddle.net/LijoCheeran/rqab1veh/11/2つの列と同じプロパティname: 'IsActive'を持っています。それは間違っています。 2番目の列には、コードを使用方法(たとえば、name: 'IsActive1')で修正できます。 IsActive1のフォーマッタは、cellvalueの代わりにrowObject.IsActiveを使用して、必要なデータにアクセスすることができます。対応するコードはretireButtonactiveButtonは、ボタンのHTMLフラグメントを含んでfollwing

{ 
    name: 'IsActive1', 
    width: 75, 
    formatter: function (cellvalue, options, rowObject) { 
     return rowObject.IsActive == true ? 'Active' : 'Retired'; 
    } 
}, 
{ 
    name: 'IsActive', 
    width: 100, 
    formatter: function (cellvalue, options, rowObject) { 
     return cellvalue == true ? retireButton : activeButton; 
    } 
} 

になります。

jqGridがdataアレイを保持することを理解することが重要です。方法$("#list").jqGrid('getLocalRow', rowid)は、行のデータに対応するデータ項目にというの参照を取得します。メソッドgetRowDataは、セルのHTML表現(<td>要素)からデータを取得し、そこでフォーマット解除します。返されるオブジェクトのフィールドの型は文字列です。

あなただけではなく、データを更新する必要がありますが、firstnameIsActive1IsActive列のセルの内容が、あなたはフィールドまたはより良い通話ごとにsetCellを呼び出す必要があるので1 setRowData

function updateActiveStatus (rowid, isToActive) { 
    alert('calling the function'); 
    $("#list").jqGrid('setRowData', rowid, { 
     firstname: 'A', 
     IsActive1: false, 
     IsActive: false 
    }); 
    var item = $("#list").jqGrid('getLocalRow', rowid); 
    // delete unneeded IsActive1 property created in the item 
    delete item.IsActive1; 
} 

のみsetRowData呼び出しの小さな欠点は、データの項目に新しいプロパティを作成しています。古いjqGrid 4.6では、item.IsActive1という別の場所にデータを「仮想的に」保存することはできません。空きjqGridは、saveLocallyコールバックを指定することができます。これにより、ローカル項目の列のデータをカスタム保存することができます。それはあなたのケースでは本当の大きな問題ではないとあなたはちょうどあなたが修正デモで結果を見ることができdelete item.IsActive1

によって不要なプロパティを削除する必要があるhttps://jsfiddle.net/OlegKi/rqab1veh/12/

関連する問題