РЕДАКТИРОВАТЬ
После указания Рори МакКроссана я изменил код, чтобы получить это:
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: "<",
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: ">",
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
.
Как решить эту проблему?