我正在尝试从另一个js文件中调用对象weeklytimesheet中的loadTimesheet函数。
我得到一个Object不支持属性或方法' loadTimesheet'错误。
编辑:如果与VS2012有任何关系,我在VS2012中的智能感知不起作用。
mylester.index.js
$(document).ready(function () {
$("#newtimesheet").click(function () {
weeklytimesheet.loadTimesheet();
});
});
mylester.weeklytimesheet.js
var weeklytimesheet = new function () {
load = function () {
var wkending = getWeekEnding();
var proId = $("#newtimesheet").attr("proid");
$("#divtimesheet").load("/Timesheet/NewTimesheet", new { proId: proID, enddate: wkending });
open();
};
open = function() {
$("#clipboarddialog").dialog({
autoOpen: true,
height: 800,
width: 860,
modal: true,
title: "Edit Timesheet",
buttons: {
"Save": function () {
editorForm.saveForm();
$(this).dialog("close")
},
Cancel: function () { $(this).dialog("close") }
}
});
};
getWeekEnding = function () {
var wkending;
$(".datepicker").datepicker();
$("#datepickerdialog").dialog({
autoOpen: true,
close: function () {
wkending = $("#weekending").val();
},
show: {
effect: "blind",
duration: 1000
},
hide: {
effect: "explode",
duration: 1000
}
});
return wkending;
}
return
{
loadTimesheet: load
};
}();
答案 0 :(得分:1)
问题是在new
之后回车,它告诉函数返回undefined
。以这种方式解决它:
return {
loadTimesheet: load
};
这种机制被称为分号插入是一个可怕的部分' Douglas Crockford在其出色的着作JavaScript, The Good Parts中列出的JavaScript。
此外,我建议您对代码进行两项改进:
1)不要使用new
。它不适合你在这里做的事情。如果您想要的是用于声明辅助函数的本地范围,那么这里有一个技巧:使用您立即调用的函数表达式:
var weeklytimesheet = (function () {
// do your local stuff ...
return {
loadTimesheet: load
};
} ()); // see? call the function immediately. That's how you make nontrivial expressions in JS.
2)不要分配您尚未声明的变量(load
,open
,getWeekEnding
)。你可能已经习惯了Python,但在JavaScript中它有一个非常糟糕的效果:这些变量被解释为全局Object(window
)的属性,这使得它们根本不是本地的,并且污染了全局命名空间。我想你不想要那个;使用函数声明(function open () {...}
)可以很好地解决这个问题。
总而言之,以下是我将如何重写您的代码:
var weeklytimesheet = (function () {
function load () {
var wkending = getWeekEnding();
var proId = $("#newtimesheet").attr("proid");
$("#divtimesheet").load("/Timesheet/NewTimesheet", new { proId: proID, enddate: wkending });
open();
}
function open () {
$("#clipboarddialog").dialog({
autoOpen: true,
height: 800,
width: 860,
modal: true,
title: "Edit Timesheet",
buttons: {
"Save": function () {
editorForm.saveForm();
$(this).dialog("close")
},
Cancel: function () { $(this).dialog("close") }
}
});
}
function getWeekEnding () {
var wkending;
$(".datepicker").datepicker();
$("#datepickerdialog").dialog({
autoOpen: true,
close: function () {
wkending = $("#weekending").val();
},
show: {
effect: "blind",
duration: 1000
},
hide: {
effect: "explode",
duration: 1000
}
});
return wkending;
}
return {
loadTimesheet: load
};
}());