如何使 javascript 模块模式与 ajax 一起工作?
我正在尝试转换一些 javascript/jquery 代码以能够处理 ajax 选项卡。
当页面加载时,我会加载所有脚本,并使用 jquery live 和 livequery 插件来帮助绑定。
每次都在部分视图(asp.net mvc 3)中,单击时转到控制器操作并呈现部分视图并将其粘贴在选项卡中。
所以 live 和 livequery 解决了除了这一问题之外的大部分问题。我正在使用 jquery datatables.net 插件,一旦它呈现,我将其存储在变量中并在地方使用它。
问题是因为我使用的是模块模式,所以代码在表格渲染之前就运行了很长时间。所以存储对象的变量是“未定义的”。我尝试用 jquery livequery 语句包装它,这使得表运行,但变量仍然是“未定义”。
我的猜测是,这与 C# 不同,它会更新引用。所以我认为它在我的全局变量(模块模式的变量)中并且永远不会更新。
var tab = (function (my, $)
{
var myTable = my.dataTable = my.dataTable || {};
myTable.oDataTable = {};
myTable.init = function ()
{
myTable.oDataTable = _fnSetupTable();
_fnCreateDateFilters();
};
myTable.delete= function (rowToDelete)
{
// Need to get the position of the row. Need to use index
var pos = this.oDataTable.fnGetPosition(rowToDelete[0]);
/* delete row from table - first param is index of row */
this.oDataTable.fnDeleteRow(pos, null, true);
};
function _fnSetupTable()
{
/* Initialize datatable object */
$('#table').livequery(function ()
{
// oDataTable gets used in alot of places later on but since it undefined
// it will crash when used.
var oDataTable = $(this).dataTable(
{
"bJQueryUI": true,
"bFilter": true,
"bAutoWidth": false,
"sPaginationType": "full_numbers",
"aaSorting": [[3, 'asc']], //Default sorting on datetime
"oLanguage":
{
"sZeroRecords": "No Records"
},
"aoColumns":
[
{ "bSortable": true, "bSearchable": false },
{"bSortable": true, "bSearchable": false },
{"bSortable": false, "bSearchable": false },
{"bSortable": false, "bSearchable": false },
{"iDataSort": 3 },
{ "bSortable": false, "bSearchable": true },
{"bSortable": false, "bSearchable": false },
{"bSortable": false, "bSearchable": false}
]
});
return oDataTable;
});
}
return my;
} (tab || {}, jQuery));
我经常使用 oDataTable。正如您所看到的,如果我会调用 myTable.Delete 我在那里使用它 oDataTable 但它会“未定义”并崩溃。
我有另一个模块类来启动整个序列(因此使上面的代码运行)
/*
* Document Ready
*/
$(function ()
{
/* Initializes all plugins and events */
tab.init();
});
var tab = (function (my, $)
{
my.init = function ()
{
tab.preload();
tab.dataTable.init();
$('#tabs').tabs();
};
return my;
} (tab || {}, jQuery));
I am trying to convert some javascript/jquery code to be able to handle ajax tabs.
I have all my scripts load up when the pages loads up and I use jquery live and livequery plugin to help with the binding.
Each time is in a partial view(asp.net mvc 3) and when clicked goes to a controller action and renders the partial view and sticks it in the tab.
So the live and livequery are solving most of the problems except for this one problem. I am using the jquery datatables.net plugin and once it renders that I store it in a variable and use it places.
The thing is since I am using the module pattern the code runs long before the table is even rendered. So the variable storing the object is "undefined". I tried to wrap it around with jquery livequery statement and that makes the table run but the variable is still "undefined".
My guess is that is not like C# were it would update the reference. So I am thinking that it is in my global variable(the one for the module pattern) and that never gets updated.
var tab = (function (my, $)
{
var myTable = my.dataTable = my.dataTable || {};
myTable.oDataTable = {};
myTable.init = function ()
{
myTable.oDataTable = _fnSetupTable();
_fnCreateDateFilters();
};
myTable.delete= function (rowToDelete)
{
// Need to get the position of the row. Need to use index
var pos = this.oDataTable.fnGetPosition(rowToDelete[0]);
/* delete row from table - first param is index of row */
this.oDataTable.fnDeleteRow(pos, null, true);
};
function _fnSetupTable()
{
/* Initialize datatable object */
$('#table').livequery(function ()
{
// oDataTable gets used in alot of places later on but since it undefined
// it will crash when used.
var oDataTable = $(this).dataTable(
{
"bJQueryUI": true,
"bFilter": true,
"bAutoWidth": false,
"sPaginationType": "full_numbers",
"aaSorting": [[3, 'asc']], //Default sorting on datetime
"oLanguage":
{
"sZeroRecords": "No Records"
},
"aoColumns":
[
{ "bSortable": true, "bSearchable": false },
{"bSortable": true, "bSearchable": false },
{"bSortable": false, "bSearchable": false },
{"bSortable": false, "bSearchable": false },
{"iDataSort": 3 },
{ "bSortable": false, "bSearchable": true },
{"bSortable": false, "bSearchable": false },
{"bSortable": false, "bSearchable": false}
]
});
return oDataTable;
});
}
return my;
} (tab || {}, jQuery));
I use oDataTable quite a bit. As you can see if I would call up myTable.Delete I use it oDataTable there but it will be "undefined" and crash.
I have another module class that starts the whole sequence(so makes the above code run)
/*
* Document Ready
*/
$(function ()
{
/* Initializes all plugins and events */
tab.init();
});
var tab = (function (my, $)
{
my.init = function ()
{
tab.preload();
tab.dataTable.init();
$('#tabs').tabs();
};
return my;
} (tab || {}, jQuery));
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您似乎正在调用许多东西
oDataTable
,并且它们都以不兼容的方式分配/访问。我看到的第一个问题是,您尝试从
_fnSetupTable
返回的oDataTable
值实际上是从 inner 函数返回的,因此以下赋值不执行任何操作:您尝试使用
_fnSetupTable
的结果,但 _fnSetupTable
实际上不会返回任何内容,其内部函数会返回任何内容。也许更大的问题是如何使用模块模式。我将尝试创建一个小示例来演示该问题:
如您的示例中所示,创建了一个名为
myTable
的局部变量并给出了表属性,但返回的是my
>,而不是myTable
。如果您希望可以从返回的my
对象访问这些属性,则需要将它们分配给my
。或者也许您想返回myTable
?There seem to be a number of things you're calling
oDataTable
and they are all assigned/accessed in incompatible ways.The first problem I see is that the
oDataTable
value you attempt to return from_fnSetupTable
is actually scoped to and returned from the inner function, so the following assignment does nothing:You're trying to use the result of
_fnSetupTable
but _fnSetupTable
doesn't actually return anything, its inner function does.Perhaps a larger problem is how you're using the module pattern. I'll try to create a small example to demonstrate the problem:
As in your example a local variable called
myTable
is created and given the table properties, but what's being returned ismy
, notmyTable
. If you want those properties to be accessible from themy
object that's returned, then you need to assign them tomy
. Or maybe you meant to returnmyTable
?