Кнопка редактирования сетки Kendo UI не работает после загрузки сохраняемого состояния

Я использую Teleric Kendo UI Grid. Я использую таблицу базы данных для хранения параметров сетки, чтобы сохранить (сохранить) состояние сетки (порядок столбцов, нет просмотра столбцов по умолчанию и т. Д.). Это опция сохранения для каждого пользователя, когда имя пользователя будет автоматически загружено с помощью вызова ajax. Все отлично работает

Но проблема в том, что кнопка Edit не работает после загрузки сохраненного состояния.
Пожалуйста помоги.

заранее спасибо

<div class="row">
<div class="col-md-12 col-sm-12 col-xs-12">
<?php echo $this->session->flashdata('message');?>
<div class="panel panel-default">
<div class="panel-heading clearfix">

<div class="panel-body">

<?php
$transport = new \Kendo\Data\DataSourceTransport();

$read = new \Kendo\Data\DataSourceTransportRead();

$read->url(site_url('task/jsonMData'))
->contentType('application/json')
->type('POST');

$transport->read($read)
->parameterMap('function(data) {
return kendo.stringify(data);
}');

$model = new \Kendo\Data\DataSourceSchemaModel();

$id = new \Kendo\Data\DataSourceSchemaModelField('id');
$id->type('number');

$Name = new \Kendo\Data\DataSourceSchemaModelField('name');
$Name->type('string');

$Address = new \Kendo\Data\DataSourceSchemaModelField('address');
$Address->type('string');$model->addField($id)
->addField($Name)
->addField($Address);$schema = new \Kendo\Data\DataSourceSchema();
$schema->data('data')
->model($model)
->total('total');

$dataSource = new \Kendo\Data\DataSource();

$dataSource->transport($transport)
->pageSize(500)
->schema($schema)
->serverFiltering(true)
->serverSorting(true)
->serverGrouping(false)
->serverPaging(true);

$grid = new \Kendo\UI\Grid('grid');

$idField = new \Kendo\UI\GridColumn();
$idField->field('id')
->locked(false)
->width(60)
->hidden(true)
->title('ID');$nameField = new \Kendo\UI\GridColumn();
$nameField->field('name')
->width(100)
->locked(false)
->hidden(true)
->title('Name');
$addressField = new \Kendo\UI\GridColumn();
$addressField->field('address')
->width(200)
->locked(false)
->hidden(true)
->title('Address');$command = new \Kendo\UI\GridColumnCommandItem();
$command->click('commandClick')
->text('Edit');

$commandColumn = new \Kendo\UI\GridColumn();
$commandColumn->addCommandItem($command)
->title('Edit')
->width(125);

$excel = new \Kendo\UI\GridExcel();
$excel->fileName(' Task Export.xlsx')
->filterable(true)
->proxyURL('task/saveToExcel');

$grid->addColumn($id,
$name, $commandColumn)
->height(500)
->scrollable(true)
->editable('popup')
->dataSource($dataSource)
->resizable(true)
->reorderable(true)
->sortable(true)
->filterable(true)
->columnMenu(true)
->pageable(true)
->addToolbarItem(new \Kendo\UI\GridToolbarItem('excel'))
->excel($excel);

$grid->columnHide('function(e) { saveGridState(); }');
$grid->columnShow('function(e) { saveGridState(); }');

echo $grid->render();
?>

</div></div></div>

<div style="display:none;">
<a href="#" id="hidden-link" class="fancybox fancybox.iframe">Click</a>
<input type="hidden" name="rowIndex" id="rowIndex" value="-1" />
<input type="hidden" name="taskId" id="taskId" value="0" />
</div>
<!--to support excel import -->
<script>
function commandClick(e) {e.preventDefault();
var dataItem = this.dataItem($(e.currentTarget).closest("tr"));
console.log(dataItem);

var grid = $(e.currentTarget).closest("tr");
var row = grid.select();

var rowIndex = row.index();

var j = $('#hidden-link');
if(j)
{
$('#rowIndex').val(rowIndex);
$('#taskId').val(dataItem.id);
j.attr('href','<?php echo base_url()."task/edit";?>/'+dataItem.id)
j.click();
}
}
</script>
<script type="text/javascript">
$(document).ready(function() {
$(".fancybox").fancybox({
'afterClose':function () {
var rowIdx = $('#rowIndex').val();
var taskId = $('#taskId').val();
if(taskId != 0 && rowIdx >= 0)
{
userData = 'id='+taskId;
$.ajax({
url: "<?php echo site_url('task/getTaskById');?>",
type: "post",
data: userData,
dataType: "json",
success: function(data){
var firstRowItem = $('#grid').data().kendoGrid.dataSource.data()[rowIdx];

firstRowItem.set('Name',data.name);
firstRowItem.set('Plant',data.address);},
async:false,
error:function(){

alert('There is error while submit');
}

});
}
},
});var grid = $("#grid").data("kendoGrid");
userData = "type='m'";
$.ajax({
url: "<?php echo site_url('task/getGridSavedState');?>",
type: "post",
data:{type:'m'},
// contentType:'application/json',
dataType: "json",
success: function(data){
if(data.columns)
{
options=data;
grid.setOptions(options);
}
},
error:function(){

console.log("Error loding save grid state");
}
});

});
function saveGridState()
{
var grid = $("#grid").data("kendoGrid");
gridOptions=grid.getOptions();
var request=kendo.stringify({gridOptions : gridOptions,type:'m'});

$.ajax({
url: "<?php echo site_url('task/saveGridState');?>",
type: "post",
contentType:'application/json',
data: request,
dataType: "json",
success: function(data){
console.log("stated saved");
},
error:function(){

console.log("Error in stated saved")
}
});

}

</script>

0

Решение

Из документов API

Обратите внимание, что когда объект параметров извлекается и затем сериализуется в строку через JSON.stringify (параметры), каждое поле, являющееся функцией, будет потеряно. Это ограничение сериализации, которое делает JSON.stringify. Вам нужно либо явно установить поля, которые были функциями, после синтаксического анализа объекта, либо вам нужно использовать некоторую пользовательскую реализацию для сериализации для обработки сериализации функций JavaScript.

Так что вам нужно снова привязать командную кнопку к функции: по крайней мере, я думаю, что именно это они и имеют в виду. Поэтому попробуйте добавить базовую функцию jQuery (‘selector’). On (‘click’) после setOptions.

0

Другие решения

  var grid = $("#grid").data("kendoGrid");
userData = "type='m'";
$.ajax({
url: "<?php echo site_url('task/getGridSavedState');?>",
type: "post",
data:{type:'m'},

dataType: "json",
success: function(data){
if(data.columns)
{
options=data;
if(options.editable)
{
//popout last column i.e command column
edit= options.columns.pop()
//add new command column explicitly.
commandCol={"command":[{"text":"Edit","click":commandClick}],"title":"Edit","width":125};
options.columns.push(commandCol);
grid.setOptions(options);
}
}
},
error:function(){

console.log("Error loding save grid state");
}
});
0

По вопросам рекламы [email protected]