如何在javascript中等待this.submit()函数完成
编辑 在Rory McCrossan的指示后,我更改了代码以获得以下信息:如何在javascript中等待this.submit()函数完成,javascript,jquery,datatables,Javascript,Jquery,Datatables,编辑 在Rory McCrossan的指示后,我更改了代码以获得以下信息: var backNext = [ { text: "<", action: function (e) { this.submit( function () { }, null, null, false ); table.on( 'draw', function () {
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();
});
}
}
];
当我通过提供以下数据编辑第一行时:{'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();
});
}
}
];
//在中创建上一个、保存和下一个按钮的按钮数组定义
//编辑表格
var backNext=[
{
正文:“,
行动:职能(e){
//提交时,找到当前选定的行并选择上一行
这个。提交(函数(){
}).done(函数(){
var index=table.rows({search:'applied'}).index();
var currentIndex=table.row({selected:true}).index();
var currentPosition=索引.indexOf(currentIndex);
如果(当前位置>0){
var-prev;
对于(设i=currentPosition;i>0;i--){
if(表行(i-1).data()[“日期”]=“”){
prev=i-1;
打破
}
}
如果(上一个!==未定义){
table.row(currentIndex).deselect();
table.row(索引[prev]).select();
}
}
//通过按钮触发编辑
table.button(0.trigger();
});
}
},
“保存”,
{
正文:“,
行动:职能(e){
this.submit(函数(){
}).done(函数(){
var currentIndex=table.row({selected:true}).index();
var currentPosition=this.index.indexOf(currentIndex);
var index=table.rows({search:'applied'}).index();
如果(当前位置
代码应该做什么:
当我按下next
或previous
按钮时,我必须转到下一行/上一行,,但只有当到期日期为空时才可以
在上面的示例中,编辑第1行后,next
按钮必须跳过第二行,将我带到第三行
现在的问题是Ajax是异步的,这意味着使用datatables站点上提供的示例,索引和当前位置的恢复只考虑表的先前结构。新行未被考虑在内。这就是为什么我添加了done
方法,以等待ajax请求完成并重新绘制表,从而检索索引和当前位置
但是我的代码不能正常工作。我得到错误未捕获类型错误:this.submit(…).done不是一个函数
如何解决这个问题?
submit()
不是一个异步方法,因此done()
是不相关的(正如错误所暗示的)。如果要在数据更新时对datatable执行某些逻辑,则需要向其添加事件侦听器。对于你的情况,我建议draw
。非常感谢你,我刚刚调整了我的代码,效果非常好。但是我对这一行有点问题:var currentPosition=index.indexOf(currentdex)代码>。这一行给出了错误:uncaughttypeerror:无法读取未定义的
的属性'indexOf'。我不是javascript专家,但我觉得这与以下事实有关:此代码不是在this
的上下文中执行的。你能给我看看解决这个问题的方法吗?
// 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();
});
}
}
];