web-dev-qa-db-ja.com

剣道グリッドで列の値を手動で設定する方法

コンソールでコメントを設定することはできましたが、ユーザーが変更を保存した後、グリッドにコメント値を設定する方法がわかりません。

剣道グリッドに手動で値を設定する方法はありますか?

出力例

         |Remark         |User Name|Phone Number|Country
 [unable]|username length|ad       |0123456789  |UK
 [enable]|               |admin2   |0123456222  |US
 [enable]|               |admin3   |0123333339  |CN

ユーザーがテーブルを編集した後-出力

         |Remark         |User Name|Phone Number|Country
 [enable]|               |admin1   |0123456789  |UK
 [enable]|               |admin2   |0123456222  |US
 [enable]|               |admin3   |0123333339  |CN

プロジェクトのサンプルは、コードスニペットで提供されています。

var defaultData = [{
  reason: "",
  userName: "ad",
  phoneNumber: "0123456789",
  country: "UK"
}, {
  reason: "",
  userName: "admin2",
  phoneNumber: "0123456222",
  country: "US"
}, {
  reason: "",
  userName: "admin3",
  phoneNumber: "0123333339",
  country: "CN"
}];
var defaultColumns = [{
  field: "",
  width: "40px",
  template: "<input name='Discontinued' id='remarkCheckBox' class='checkbox' #= (reason.length > 0)? 'disabled=disabled' : ''# type='checkbox' />"
}, {
  field: "reason",
  title: "Remark",
  attributes: {
    style: "color:\\#cc0000"
  }
}, {
  field: "userName",
  title: "User Name"
}, {
  field: "phoneNumber",
  title: "Phone Number"
}, {
  field: "country",
  title: "Country"
}];



var viewModel = kendo.observable({
  onClick: function() {
    loadImportGrid(defaultData, defaultColumns);
  },

});

function loadImportGrid(defaultData, defaultColumns) {
  var grid = $("#grid").kendoGrid({
    columns: defaultColumns,

    dataSource: {
      data: defaultData
    },
    dataBound: function() {
      grid = $("#grid").data("kendoGrid");
      grid.saveChanges();
    },
    saveChanges: function() {
      getRemark();
    },
    toolbar: ["save"],
    selectable: "row",
    scrollable: true,
    sortable: true,
    editable: true
  });

}

function validation(objectList) {
  if (!objectList.userName || objectList.userName.length < 4) {
    invalidRecordFormat = "username length";
    return invalidRecordFormat;
  }

  if (!objectList.country || objectList.country === " ") {
    invalidRecordFormat = "country invalid";
    return invalidRecordFormat;
  }
  invalidRecordFormat = "";
  return invalidRecordFormat;
}


function getRemark() {
  var data = $("#grid").data("kendoGrid").dataSource._data;
  for (var i = 0; i < data.length; i++) {
    console.log(validation(data[i]));
  }
}
kendo.bind($("#importFile"), viewModel);
html * {
  font-size: small;
  font-family: Arial !important;
}
.uploadLabel {
  color: white;
  background-color: #008efe;
  border-style: solid;
  border-width: 1px 1px 1px 1px;
  width: 100px;
  height: 30px;
  text-align: center;
  border-radius: 3px;
  display: block;
  line-height: 250%;
}
#importUserFile {
  opacity: 0;
  position: absolute;
  z-index: -1;
}
<!DOCTYPE html>
<html>

<head>
  <link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.3.914/styles/kendo.common-bootstrap.min.css" />
  <link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.3.914/styles/kendo.bootstrap.min.css" />
  <link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.3.914/styles/kendo.bootstrap.mobile.min.css" />
  <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
  <script src="http://kendo.cdn.telerik.com/2016.3.914/js/kendo.all.min.js"></script>

  <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
  <script src="http://kendo.cdn.telerik.com/2016.2.607/js/kendo.all.min.js"></script>

  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>

<body>
  <div id="importFile">
    <label class="uploadLabel" for="importUserFile">Browse</label>
    <input name="file" id="importUserFile" data-bind="events:{click:onClick}" />
  </div>
  <div id="grid"></div>
</body>

</html>
6
Austin Hoh

検証が正しいかどうかに基づいて、これが最初の列の値を更新する方法です。

for (var i = 0; i < data.length; i++) {   
    //access record using for loop - here i is value from loop
    var firstItem = $('#grid').data().kendoGrid.dataSource.data()[i];

    //set col reason value value
    firstItem["reason"]="username length"; 

    //refresh the grid
    $('#grid').data('kendoGrid').refresh();  
}    

別の方法は、この post で説明されているようにdataitem setメソッドを使用することです。

DataItem.set()メソッドは、毎回イベントをトリガーするため、非常に低速です。 100のリストでさえ著しく遅いです。

大規模な更新を処理するには、

dataItem[field] = value

欠点は、ダーティマーカーが適用されず、グリッドに変更が反映されないことです。

$('#grid').data('kendoGrid').refresh();  
6
Sean Ch

値を変更するには、常にモデルの set() メソッドを使用してください。 refresh()する必要はありません。例:

var dataItem = $("#grid").data("kendoGrid").dataSource.data()[0];
dataItem.set("reason", "new value");

デモ

9
DontVoteMeDown