Попытка получить доступ к переменной dataTable вне ajax дает неопределенный - PullRequest
0 голосов
/ 28 мая 2019

У меня есть автозаполнение jquery, которое после выбора значения загружает данные с флажком из вызова ajax.Затем при отправке формы мне нужно получить доступ к переменной datatable, чтобы перебрать каждую строку, чтобы получить выбранные, но переменная datatable отображается как неопределенная.

Я делаю то же самое, что и в этом примере. Разница лишь в том, что данные поступают из Ajax-запроса.

Не могли бы вы помочь мне понять, почемупроисходит?

$(document).ready(function() {
  var campId;
  var t_OmnitureCode;

  // Campaign input autocomplete
  $("#campaign").autocomplete({
    source: function(request, response) {
      $.ajax({
        url: "promotion",
        type: "GET",
        data: {
          term: request.term,
          action: "searchCampaign"
        },
        dataType: "json",
        success: function(data) {
          if (!data.length) {
            var result = [{
              label: "no match found",
              value: "-1"
            }];
            response(result);
          } else {
            response($.map(data, function(item) {
              return {
                label: item.name,
                value: item.campaignId
              }
            }));
          }
        }
      });
    },
    select: function(event, ui) {
      event.preventDefault();
      campId = ui.item.value;
      if (campId != "-1") {
        this.value = ui.item.label;

        // This will apply datatables getting the content from an Ajax call
        t_OmnitureCode = applyDataTableOmnitureCode(campId);
      }
    },
    focus: function(event, ui) {
      event.preventDefault();
      this.value = ui.item.label;
    }
  });

  // Handling form submission
  $("#frm_promotion").on("submit", function(e) {
    var form = this;
    // Variable for datatable "t_OmnitureCode" is undefined below
    var rows_selected = t_OmnitureCode.column(0).checkboxes.selected();

РЕДАКТИРОВАТЬ: Только что понял, что даже при присвоении переменной (t_OmnitureCode = applyDataTableOmnitureCode(campId);) она не определена, не знаю почему.

Вот applyDataTableOmnitureCodeкод:

function applyDataTableOmnitureCode(campId) {
    $("#tbl_omnitureCode").DataTable({
        destroy: true, 
        scrollX: true,                                      
        fixedColumns: {
            leftColumns: 1
        },
        "ajax": {
            "url": "promotion",
            "type": "GET",
            "data": {
                action: "searchOmnitureCodesByCampaignId",
                campaignId: campId
            },
            "dataSrc": ""
        },                  
        "columns": [                        
            { "data": "key" },
            { "data": "omnitureCode" },
            { "data": "urlAppName" },
            { "data": "language" },
            { "data": "channel" },
            { "data": "createDateTime", "defaultContent": "" },
            { "data": "updateDateTime", "defaultContent": "" }
        ],
        "columnDefs": [                     
            { "targets": 0, "checkboxes": { "selectRow": true } }
        ],
        "select": {
            "style": "multi"
        },
        "order": [[1, "asc"]],
        "fnInitComplete": function() {
            $("#omnitureCodeSection").show();
        }
    });
};

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Вам может потребоваться захватить ваш объект DataTables в переменную перед использованием этого:

var t_OmnitureCode = $("#tbl_omnitureCode").DataTable();
var rows_selected = t_OmnitureCode.column(0).checkboxes.selected();

И, кстати, ваш метод заполнения DataTable внешним ajax-вызовом неоптимален.Для этой цели есть опция ajax, где вы можете указать все необходимые параметры и получить лучшую интеграцию с API DataTables и более высокую производительность (поскольку вам не нужно уничтожать и создавать свой DataTable при каждом обновлении).).

Вам просто нужно будет вызвать .ajax.reload() всякий раз, когда вам нужно обновить данные таблицы.

0 голосов
/ 28 мая 2019

Это вопрос области: вы объявляете таблицу переменных внутри функции $ (document) .ready.Возможно, вы захотите поместить его в глобальную область видимости:

var table;

$ (document) .ready (function () {table = $ ('# example'). DataTable ({
...});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...