MVC 4无法从另一个js文件调用javascript函数

时间:2014-10-15 03:52:35

标签: jquery asp.net-mvc asp.net-mvc-4

我正在尝试从另一个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
    };
}();

1 个答案:

答案 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)不要分配您尚未声明的变量(loadopengetWeekEnding)。你可能已经习惯了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
  };

}());