2016-06-21 2 views
0

Я пытаюсь получить либо options, либо, в идеале, dynamicTable, переданный с initializeTable в функцию applyTableFilters, и у меня возникают проблемы с получением ожидаемых значений. Я использую List.js для создания динамической таблицы, и мне нужно передать или воссоздать объект dynamicTable, чтобы я мог продолжить и использовать его для фильтрации таблицы.Передача аргументов от одной функции до другой без ее вызова

Вот функция, которая создает объект List.js из HTML таблицы:

function initializeTable(options) { // initializes table to be dynamic using List.js functions 
    var dynamicTable = new List("table-content", options); 

    dynamicTable.on("updated", function (list) { // writes a message to the user if no results are found 
     if (list.matchingItems.length == 0) { 
      document.getElementById("no-results").style.display = "block"; 
     } 
     else { 
      document.getElementById("no-results").style.display = "none"; 
     } 
    }); 

    console.log(dynamicTable); 
    console.log(options); 
    console.log(arguments.length); 

    applyTableFilters.bind(); 
} 

Я пробовал различные методы, чтобы передать переменные в функции ниже. Я пробовал .call, applyTableFilters(args) и .apply, но проблема в том, что я не хочу, чтобы функция выполнялась изнутри здесь, только когда событие click от кнопки гаснет (не показано в этих функциях).

Это функция, которую я хочу передать объект и продолжить, чтобы сделать функции фильтра, используя его:

function applyTableFilters(dynamicTable) { 
    var form = document.getElementById("filter-form"); 

    //console.log(options); 

    //var dynamicTable = new List("table-content", options); 

    console.log(dynamicTable); 

    var filters = form.querySelectorAll('input[type="checkbox"]:checked'); 

    dynamicTable.filter(function (item) { 
     console.log(item); 
     console.log(item._values); 

     if (item.values().id == 2) { 
      return true; 
     } 

     else { 
      return false; 
     } 

     //var filterStrings = []; 

     //console.log(filters); 

     //for (var i = 0; i < filters.length; i++) { 
     // var filterVal = filters[i].value; 
     // var filterString = "(" + item.values().column == filterVal + ")"; // filterVal.contains(item.values().column) || 
     // filterStrings.push(filterString); 

     // console.log(filterVal); 
     // console.log(filterString); 
     //} 

     //console.log(filterStrings); 

     //var filterString = filterStrings.join(" && "); 

     //console.log(filterString); 
     //return filterString; 
    }); 
} 

я использовал:

applyTableFilters.bind(this, dynamicTable/options); 
applyTableFilters.bind(null, dynamicTable/options); 
applyTableFilters.bind(dynamicTable/options); 

Переключение между ними, так как я не нужно, чтобы оба передавались, если кто-то заканчивал работу, и т. д. Я всегда получаю событие мыши, и это даже не тот подходящий тип объекта, который я ищу. Как я могу получить правильный объект? Кроме того, все значения в первой функции не являются пустыми и заполняются так, как ожидалось, поэтому исходные переменные не являются неопределенными или нулевыми. Заранее спасибо.

+0

Как насчет обертывание этой функции с помощью другой функции для того, чтобы создать функциональную область, которую можно предварительно включить значение аргумента вы хотите. Затем вызовите функцию обертки с другими аргументами, когда вам нужно. Вот простой пример [JSFiddle] (https://jsfiddle.net/BloodyKnuckles/76bq0pyw/), что я имею в виду. – bloodyKnuckles

+0

@bloodyKnuckles Я пытался сделать это раньше, но я не понимаю, как это будет работать в этом случае. У меня будет пример функции 'shell()', которая принимает переменную 'dynamicTable' и передает ее в последнюю функцию, но для ее подачи она будет нуждаться в той же переменной, в которой мне нужно пройти, как это сделать Работа? Ex. 'var dynamicTable = shell()' но параметр должен быть передан для работы, знаете, что я имею в виду? – LaLaLottie

ответ

0

Функция initializeTable возвращает функцию, которая обертывает функцию applyTableFilters аргументами, которые вы хотите.

Затем назначьте возвращаемую функцию var, которая будет выполнена позже.

function initializeTable(options) { 
    var dynamicTable = new List("table-content", options); 
    // other stuff 

    return function() { 
     applyTableFilters(dynamicTable) 
    } 
} 

// other stuff 

var applyTableFiltersPrep = initializeTable(options) 

// later, when you want to execute... 
applyTableFiltersPrep() 

JSFiddle example

+0

Спасибо. Сначала я был обеспокоен тем, что это противоречило бы с другой функцией (не отправленной), где я назвал 'initializeTable', но похоже, что это может сработать. – LaLaLottie

Смежные вопросы