数据库对象在函数内不可用

时间:2014-11-19 21:49:42

标签: javascript jquery datatable dropbox-api

我正在使用jQuery和Datatables plugin来绘制表格。我使用的数据来自Dropbox Datastore API。我认为这个问题更多的是关于JavaScript变量范围,而不是关于Datatables或Dropbox,所以希望有人可以提供帮助。

这是我的代码。评论描述了每一步。

$(function(){

  //Authenticate dropbox
  client.authenticate({interactive: false}, function(error) {
    // Get aircraft data from dropbox
    var aircraftData = [];

    function getAircraftData(){
      aircraftData.push(...);
    }
    getAircraftData();

    //Initialize Aircraft table
    var aircraftTable = $('#aircraft-table').DataTable({
      data:aircraftData,
      ...
    }); 
    console.log(aircraftTable); //This yields a generic [object Object]

    //Incoming data changes from Dropbox listener
    datastore.recordsChanged.addListener(function (event) {
      //Update aircraftData[]
      getAircraftData();

      //Refresh the datatable
      aircraftTable.draw(); // -!- ERROR: undefined is not a function -!-
      console.log(aircraftTable); //This also yields a generic [object Object]
    });
  });
});

我猜测aircraftTable不可用,因为它在Dropbox侦听器函数内部时超出了范围。如何将其纳入范围以便可用?

更新

我调整了我的代码以显示一些额外的上下文。所有这一切都发生在另一个Dropbox功能中。通常,当您将DataTable对象记录到控制台时,它看起来像这样:

[context: Array[1], selector: Object, tables: function, table: function, draw: function…]

该表工作正常,但以某种方式引用它不起作用。

1 个答案:

答案 0 :(得分:1)

好的,我终于明白了。

首先,当我将内容记录到控制台时,我在前面添加了一些类似这样的描述:

console.log('Aircraft table: '+aircraftTable); 

...记录了[object Object]。但是,如果要查看对象及其属性,则无法将其与字符串连接。你必须这样做:

console.log(aircraftTable);

事实证明aircraftTable实际上是可用的,但我使用了错误的方法。以下是获取新数据并重绘表格的正确方法:

//Refresh table                
var aircraftData = getAircraftData();                
aircraftTable.clear().rows.add(aircraftData).draw();

以下是rows.add()的文档:http://datatables.net/reference/api/rows.add()

真是一种解脱。 :)