Я пытаюсь преобразовать некоторый код javascript / jquery, чтобы иметь возможность обрабатывать вкладки ajax.
У меня есть все мои скрипты, загружаемые при загрузке страниц, и я использую плагин jquery live и livequery, чтобы помочь с привязкой.
Каждый раз, когда выполняется частичное представление (asp.net mvc 3), и при щелчке он переходит к действию контроллера, отображает частичное представление и вставляет его во вкладку.
Таким образом, live и livequery решают большинство проблем, за исключением одной. Я использую плагин jquery datatables.net, и как только он показывает, что я храню его в переменной и использую его местами.
Дело в том, что, поскольку я использую шаблон модуля, код выполняется задолго до того, как таблица даже будет отрисована. Таким образом, переменная, хранящая объект, является «неопределенной». Я попытался обернуть его с помощью оператора livequery jquery, и это заставило таблицу работать, но переменная по-прежнему "undefined".
Я предполагаю, что это не похоже на 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));