Проверка на onCellChange с помощью Slickgrid - PullRequest
2 голосов
/ 06 июня 2011

Я только начал использовать slickgrid (++ к автору между прочим) - столкнулся с несколькими небольшими проблемами - я хочу динамически обновить некоторые поля, используя контекстное редактирование. После завершения редактирования я хочу отправить это на сервер, который также должен проверить, что было отправлено. Если есть ошибка, я хотел бы обработать ошибку аналогично тому, как работает событие validatr? например выделите ячейку и не позволяйте пользователю отойти, пока она не станет действительной, однако я не вижу, как я могу это сделать? Любой совет по этому вопросу будет принята с благодарностью!

Код до сих пор ...

grid.onCellChange.subscribe(function(e, args) {
    var item = args.item;
    var column = args.cell;       
    var row = args.row;
    var value = data[args.row][grid.getColumns()[args.cell].field];
    var id = args.item.id;
    var field = grid.getColumns()[args.cell].field;
    var dataString = "id="+id+"&field="+field+"&value="+value;
    var status = false;
    $.ajax({
        type: "POST",
        url: "/en/<?php echo $this->controller; ?>/updateattribute/&callback=?'",
        data: dataString,
        dataType: "json",
        success: function(a) {  
            console.log(data);              
            if(a.status == true) {                  
                status = true;
            } else {
                status = false;             
            }       
            return false; 
        }
    });    
    if(!status) {
        return false;
    }             
    grid.invalidateRow(data.length);
    data.push(item);
    grid.updateRowCount();
    grid.render();
});

Большое спасибо

Ответы [ 2 ]

2 голосов
/ 06 июня 2011

Ajax-запросы по умолчанию являются асинхронными, что означает, что

if(!status) {
    return false;
}             
grid.invalidateRow(data.length);
data.push(item);
grid.updateRowCount();
grid.render();

, вероятно, будет выполняться до обратного вызова success.Пара разных решений:

  • Сделать запрос ajax синхронным ( не рекомендуется ):

    $.ajax({ ... async: false, ...})
    
  • Поместить всекода, следующего за запросом ajax в обратном вызове success или complete.Примерно так (не проверено):

    grid.onCellChange.subscribe(function(e, args) {
        // snip...
    
        $.ajax({
            type: "POST",
            url: "/en/<?php echo $this->controller; ?>/updateattribute/&callback=?'",
            data: dataString,
            dataType: "json",
            success: function(a) {  
                console.log(data);              
                if(a.status) {                  
                    grid.invalidateRow(data.length);
                    data.push(item);
                    grid.updateRowCount();
                    grid.render();
                }
            }
        });
    });
    

Отложенный объект jQuery также может обеспечить чистый способ написать это.

1 голос
/ 06 июня 2011

Я бы порекомендовал один из двух вариантов:

  • Отправьте изменения на сервер для проверки. Отобразите счетчик, чтобы визуально указать, что фоновый процесс запущен, и временно отключить редактирование и навигацию по ячейкам во время проверки. Получив ответ, снова включите редактирование и навигацию или переключите ячейку обратно в режим редактирования и отобразите ошибку проверки.

  • То же, что и выше, но продолжайте навигацию, просто отключите редактирование. Добавьте обработчик события onBeforeCellEdit, чтобы отобразить пользователю мягкое сообщение, информирующее его о том, что ячейка не может быть отредактирована, так как сервер еще не ответил, и отмените редактирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...