【问题标题】:Trying to access dataTable variable outside ajax is giving undefined试图访问 ajax 之外的 dataTable 变量是未定义的
【发布时间】:2019-10-14 01:35:06
【问题描述】:

我有一个 jquery 自动完成功能,一旦选择了一个值,它就会从 ajax 调用中加载一个带有复选框的数据表。然后在提交表单时,我需要访问数据表变量以迭代每一行以获取选定的行,但数据表变量显示为未定义。

我的做法与 this 示例中的相同,唯一的区别是数据来自 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();
        }
    });
};

【问题讨论】:

  • applyDataTableOmnitureCode 不返回任何内容...
  • @KevinB 你是绝对正确的,我没有看到大错误。谢谢你抓住那个。当之无愧的反对票。
  • @KevinB 请把它作为一个答案,这样我就可以给你信用

标签: javascript jquery ajax datatables


【解决方案1】:

在使用之前,您可能需要将 DataTables 对象抓取到一个变量中:

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

顺便说一下,您使用外部 ajax 调用填充 DataTable 的方法不是最理想的。有一个 ajax 选项可用于此目的,您可以在其中指定所有必要的参数并更好地与 DataTables API 集成并获得更好的性能(因为您实际上不需要在每次刷新时销毁和创建 DataTable)。

您只需在需要刷新表数据时触发.ajax.reload()

【讨论】:

  • 我正在做destroy:true 因为cannot reinitialise datatable 错误,所以我做了以下建议:https://stackoverflow.com/questions/24545792/cannot-reinitialise-datatable-dynamic-data-for-datatable
  • 这是一个非常糟糕的建议,而不是将该帖子的 OP 指向根本原因(使用外部 ajax 调用而不是使用本机选项 ajax 填充 DataTables)建议解决方法这消除了后果而不是根本原因,从而损害了应用程序的性能并导致使用 API 方法的进一步问题(如您的问题)。
  • 不用担心 :) 这是当之无愧的。现在解决我的问题的是 KevinB 发表的评论,如果他没有将其作为答案,我无法将其标记为答案。
  • 如果您的意思是您已将.DataTable() 输出分配给变量并使其在applyDataTableOmnitureCode(campId) 正文中返回,那么您会更加损害您的应用程序性能,因为您将破坏和创建您的表每次您需要使用该变量而不是像我上面建议的那样使用本机 getter 时,只需在 ajax 调用成功时调用您的函数。
【解决方案2】:

这是范围问题:您在 $(document).ready 函数中声明变量表。 你可能想把它放在全局范围之外:

变量表;

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

【讨论】:

  • 我也试过了,没用。它在哪里,应该没问题,因为该变量可用于处理表单提交部分。
  • 对不起,如果我没有得到你需要的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
相关资源
最近更新 更多