Как ждать завершения функции this.submit () в javascript - PullRequest
0 голосов
/ 04 ноября 2019

РЕДАКТИРОВАТЬ

После указания Рори МакКроссана я изменил код, чтобы получить это:

var backNext = [
    {
        text: "<",
        action: function (e) {

            this.submit( function () {

            }, null, null, false );

            table.on( 'draw', function () {
                var indexes = table.rows( {search: 'applied'} ).indexes();
                var currentIndex = table.row( {selected: true} ).index();
                var currentPosition = indexes.indexOf( currentIndex );                         

                if ( currentPosition > 0 ) {
                    var prev;
                    for (let i = currentPosition; i > 0; i--){
                        if(table.row(i-1).data()["Date"] === ""){
                            prev = i-1;
                            break;
                        }
                    }
                    if(prev !== undefined){
                        table.row( currentIndex ).deselect();
                        table.row( indexes[ prev ] ).select();
                    }
                }

                // Trigger editing through the button
                table.button( 0 ).trigger();
            });        
        }
    },
    'Enregistrer',
    {
        text: ">",
        action: function (e) {

            this.submit( function() {

            }, null, null, false );

            table.on( 'draw', function () {
                var currentIndex = table.row( {selected: true} ).index();
                var currentPosition = indexes.indexOf( currentIndex );
                var indexes = table.rows( {search: 'applied'} ).indexes();

                if ( currentPosition < indexes.length-1 ) {
                    var next = 0;
                    for (let i = currentPosition; i < indexes.length-1; i++){
                        if(table.row(i+1).data()["Date"] === ""){
                            next = i+1;
                            break;
                        }
                    }
                    if (next !== 0){
                        table.row( currentIndex ).deselect();
                        table.row( indexes[ next ] ).select();
                    }
                }

                // Trigger editing through the button
                table.button( 0 ).trigger();
            });
        }
    }
];

Это работает, но строка var currentPosition = indexes.indexOf( currentIndex ); вызывает ошибкуUncaught TypeError: Cannot read property 'indexOf' of undefined. Я думаю, что это происходит из-за того, что код выполняется вне контекста этого. Поэтому любая помощь в решении этой проблемы была бы признательна.


В настоящее время я использую опцию предыдущий / следующий редактор Datatables. Данные загружаются с сервера и отправляются с помощью ajax. Особенность в том, что при редактировании данных структура таблицы может измениться (могут быть добавлены дополнительные строки).

Пример:

| No. | Name  | Qty | Expiration Date | Balance |

  1     Books   10     ""               10
  2     Pens    5      ""               5

Когда я редактирую первую строку, предоставляя в качестве данных: {'Name': 'Books', 'Qty': 6, 'Expiration Date': 11/2022}. Количество строк меняется:

| No. | Name  | Qty | Expiration Date | Balance |

  1     Books   4      ""                4
  2     Books   6      11/2022           0
  3     Pens    5      ""                5

Вот структура моего кода:

// Buttons array definition to create previous, save and next buttons in
// an Editor form
var backNext = [
    {
        text: "&lt;",
        action: function (e) {
            // On submit, find the currently selected row and select the previous one
            this.submit( function () {
            }).done( function (){
                var indexes = table.rows( {search: 'applied'} ).indexes();
                var currentIndex = table.row( {selected: true} ).index();
                var currentPosition = indexes.indexOf( currentIndex );

                if ( currentPosition > 0 ) {
                    var prev;
                    for (let i = currentPosition; i > 0; i--){
                        if(table.row(i-1).data()["Date"] === ""){
                            prev = i-1;
                            break;
                        }
                    }
                    if(prev !== undefined){
                        table.row( currentIndex ).deselect();
                        table.row( indexes[ prev ] ).select();
                    }
                }
                // Trigger editing through the button
                table.button( 0 ).trigger();
            });
        }
    },
    'Save',
    {
        text: "&gt;",
        action: function (e) {
            this.submit( function() {

            }).done( function (){
                var currentIndex = table.row( {selected: true} ).index();
                var currentPosition = this.indexes.indexOf( currentIndex );
                var indexes = table.rows( {search: 'applied'} ).indexes();

                if ( currentPosition < indexes.length-1 ) {
                    var next = 0;
                    for (let i = currentPosition; i < indexes.length-1; i++){
                        if(table.row(i+1).data()["Date"] === ""){
                            next = i+1;
                            break;
                        }
                    }
                    if (next !== 0){
                        table.row( currentIndex ).deselect();
                        table.row( indexes[ next ] ).select();
                    }
                }
                // Trigger editing through the button
                table.button( 0 ).trigger();
            }); 
        }
    }
];

что код должен делать:

Когда я нажимаюКнопка next или previous, мне нужно перейти на следующую / предыдущую строку, , но только когда срок годности пуст .

В примере выше, после редактирования строки 1, кнопка next должна перенести меня на третью строку, пропустив вторую.

Теперь проблема в том, что Ajax является асинхронным, что означаетчто в примере, представленном на сайте таблиц данных, при восстановлении индексов и текущей позиции учитывается только предыдущая структура таблицы. Новый ряд не учитывается. Вот почему я добавил метод done, чтобы дождаться завершения запроса ajax и перерисовки таблицы, чтобы получить индексы и текущую позицию.

Но мой код не работает должным образом. Я получаю сообщение об ошибке Uncaught TypeError: this.submit(...).done is not a function.

Как решить эту проблему?

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