手动加载更新数据表数据而不调用ajax

时间:2016-07-27 14:18:43

标签: javascript ajax datatable

我试图通过使用.ajax.params()来获取最后一组ajax参数并从第一次调用中返回表数据来避免进行两次ajax调用。

然后我将自己的json传递给遵循此模式的数据表

datatable.clear();
datatable.rows.add(newDataArray);
datatable.draw();

来自question

但是我的表设置了ajax,因此当调用draw()时,会触发另一个ajax调用,这会自动传递数据。我需要的是一种在重绘表时抑制ajax调用的方法。

另一种方法是编写我自己的ajax处理并手动将数据添加到数据表中,但是我想我自己也必须自己创建ajax参数,这将是一种痛苦。

2 个答案:

答案 0 :(得分:1)

我创建了以下数据表插件,可以使用自定义ajax设置进行一次ajax加载。

var __reload = function ( settings, holdPosition, callback ) {
    // Use the draw event to trigger a callback
    if ( callback ) {
        var api = new _Api( settings );

        api.one( 'draw', function () {
            callback( api.ajax.json() );
        } );
    }

    if ( settings.oApi._fnDataSource( settings ) == 'ssp' ) {
        settings.oApi._fnReDraw( settings, holdPosition );
    }
    else {
        settings.oApi._fnProcessingDisplay( settings, true );

        // Cancel an existing request
        var xhr = settings.jqXHR;
        if ( xhr && xhr.readyState !== 4 ) {
            xhr.abort();
        }

        // Trigger xhr
        settings.oApi._fnBuildAjax( settings, [], function( json ) {
            settings.oApi._fnClearTable( settings );

            var data = settings.oApi._fnAjaxDataSrc( settings, json );
            for ( var i=0, ien=data.length ; i<ien ; i++ ) {
                settings.oApi._fnAddData( settings, data[i] );
            }

            settings.oApi._fnReDraw( settings, holdPosition );
            settings.oApi._fnProcessingDisplay( settings, false );
        } );
    }
};

jQuery.fn.dataTable.Api.register( 'ajax.loadOnce()', function ( ajax, callback, resetPaging ) {
    return this.iterator( 'table', function ( ctx ) {
        store = ctx.ajax;
        ctx.ajax = ajax;
        __reload( ctx, resetPaging===false, callback );
        ctx.ajax = store;
    } );
} );

这使得可以将数据表参数与自定义数据和新URL这样组合起来

ajax = {
    url: url,
    data: function (d){                    
        d.value = value;
    }
};

table.ajax.loadOnce(ajax);

答案 1 :(得分:0)

我有一个类似的问题。我发现最简单的解决方法是暂时禁用AJAX和服务器端处理,进行更改,然后重置如下所示的值:

function set_datatable_ajax_processing(table, bool) {
table.settings()[0].oFeatures.bServerSide = bool;
table.settings()[0].ajax = bool;
}

set_datatable_ajax_processing(table, false)
// table edits and/or draw done here ...      
set_datatable_ajax_processing(table, true)