2015-01-20 4 views
1

Я строю таблицу с использованием DataTables, и она использует AJAX для своего источника данных. Однако я не могу передать функцию в параметры AJAX; функция $ .post() (из обычного JQuery) всегда отправляет то, что моя переменная оценивает, когда загружается страница. Я довольно плохо разбираюсь в внутренней работе JS, поэтому я не уверен, что я делаю неправильно. Вот мой код:Как передать ссылку на функцию Javascript?

function init_datatable() { 

    var url = null; 
    var datasource = null; 

    // Set AJAX url and data based on which page we're on 
    if (window.location.pathname.indexOf("bookmarks") > -1) { 
    url = "/bookmarks"; 
    datasource = bookmarks; 
    } else { 
    url = "/search"; 
    datasource = $('#form').serialize(); 
    } 

    var table = $('#table').DataTable({ 
    "ajax" : function (data, callback, settings) { 
     $.post(url, datasource, function (data) { 
     callback(data); 
     }); 
    } 
    }); 
} 

Если я пишу $.post(url, $("#form").serialize()) непосредственно, без прохождения в функции serialize() внутри переменный источник данных, я получаю ожидаемый результат; каждый раз, когда форма изменяется, обновленные данные включаются в запрос POST. Однако, если я сделаю это, как написано выше, источник данных является статическим объектом того, что форма содержалась при загрузке страницы. Я также пробовал делать

datasource = function() { 
    $("#form").serialize() 
} 

но это не работает. Как я могу использовать источник данных как статический глобальный объект, так и функцию, которая должна запускаться каждый раз, когда вызывается $.post(), в зависимости от текущей страницы?

+0

Потому что вы читаете его только при загрузке страницы. Вам нужно будет переместить его внутрь! – epascarello

ответ

0

Ваш начальный, если вызывается один раз. Это проблема. Его нужно рассчитать в каждом посте.

Положите его в функции называется GetDataSource(), который возвращает его, и назвать его изначально и каждый пост :)

0

не должен это работать

function init_datatable() { 
    function datasource() { 
     var url = null; 
     var data = null; 
     // Set AJAX url and data based on which page we're on 
     if (window.location.pathname.indexOf("bookmarks") > -1) { 
      url = "/bookmarks"; 
      data = bookmarks; 
     } else { 
      url = "/search"; 
      data = $('#form').serialize(); 
     } 
     return [url, data]; 
    } 

    var table = $('#table').DataTable({ 
     "ajax": function (data, callback, settings) { 
      $.post(datasource()[0], datasource()[1], function (data) { 
       callback(data); 
      }); 
     } 
    }); 
} 
0

При объявлении var datasource = null в первых строках вашей функции вы объявляете эту переменную в области этой функции, а также любые области, вложенные в нее.

Чтобы обновить переменную datasource внутри обратного вызова ajax в DataTable, вам просто нужно переместить строку $('#form').serialize(); внутри обратного вызова в соответствии с приведенным ниже примером. Таким образом, переменная будет также установлена ​​в области функции верхнего уровня (init_datatable).

function init_datatable() { 

    var url = null; 
    var datasource = null; 

    // Set AJAX url and data based on which page we're on 
    if (window.location.pathname.indexOf("bookmarks") > -1) { 
    url = "/bookmarks"; 
    datasource = bookmarks; 
    } else { 
    url = "/search"; 
    } 

    var table = $('#table').DataTable({ 
    "ajax" : function (data, callback, settings) { 
     // each time this executes your top-level datasource variable 
     // will be updated here 
     datasource = $('#form').serialize(); 

     $.post(url, datasource, function (data) { 
     callback(data); 
     }); 
    } 
    }); 
} 
Смежные вопросы