我已經關注this question開始使用RequireJS以及RequireJS jQuery Docs。我一直無法找到如何在單個文件中重用軟件包或如何構建文件本身。以下代碼按預期工作,並在頁面上顯示文本。 javascript的第一部分會自動創建see this question for more details。我是否正確地構建了JavaScript以遵守AMD規範?
我關心的部分是AMDSpecs.js init方法。這對AMD的規格似乎適得其反。如果是這種情況,每次我需要jQuery時,是否需要調用一個require?我希望我解釋我的意思,請詢問是否需要更多信息。
HTML
<div id="output"></div>
的Javascript
<script src="/MVCTesting/Scripts/ThirdParty/RequireJS/require.js"></script>
<script type="text/javascript">
require([ "/MVCTesting/Scripts/AMD/core.js" ], function() {
require(["jquery", "/MVCTesting/Scripts/AMD/views/jquery/AMDSpecs.js"],
function($, pm) {
if (pm != undefined && pm.init) {
pm.init($);
}
});
});
</script>
/*AMDSpecs.js*/
define(function() {
//Do setup work here
return {
$: undefined,
setupEvents: function() {
$("#output").text("jQuery is working!");
},
init: function ($) {
this.$ = $;
require(["Views/JQuery/AMDSpecs"], function (specs) {
specs.setupEvents();
});
}
};
});
UPDATE
這裏是唐納德的回答了所有的代碼後,我的工作解決方案。請注意,我仍然需要在模塊名稱中包含.js,但這會簡化流程。
HtmlExtension.cs
/// <summary>
/// An Html helper for Require.js
/// </summary>
/// <param name="helper"></param>
/// <param name="module">Location of the main.js file.</param>
/// <returns></returns>
public static MvcHtmlString RequireJS(this HtmlHelper helper, string module)
{
const string jsLocation = "Scripts/AMD/";
//Don't build require string if there is not an amd script
if (!File.Exists(helper.ViewContext.HttpContext.Server.MapPath(
GetAbsolutePath(Path.Combine(jsLocation, module + ".js")))))
{
return null;
}
var require = new StringBuilder();
require.AppendLine(" require([\"" + GetAbsolutePath(jsLocation + module + ".js") + "\"], function(pm) {");
require.AppendLine(" if (pm != undefined && pm.init) {");
require.AppendLine(" pm.init();");
require.AppendLine(" }");
require.AppendLine(" });");
return new MvcHtmlString(require.ToString());
}
/// <summary>
/// Convert the path to work in IIS for MVC
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
private static string GetAbsolutePath(string path)
{
return VirtualPathUtility.ToAbsolute("~/" + path);
}
/// <summary>
/// Create the include for RequireJS based on the current page
/// </summary>
/// <param name="helper"></param>
/// <returns></returns>
public static MvcHtmlString ViewSpecificRequireJS(this HtmlHelper helper)
{
var action = helper.ViewContext.RouteData.Values["action"];
var controller = helper.ViewContext.RouteData.Values["controller"];
return helper.RequireJS(string.Format("views/{0}/{1}", controller, action));
}
_Layout.cshtml(MVCTesting是我的項目名稱)
<script data-main="/MVCTesting/Scripts/AMD/core.js" src="~/Scripts/ThirdParty/RequireJS/require.js"></script>
AMDSpecs.js
define(["jquery"], function ($) {
//Do setup work here
return {
setupEvents: function() {
$("#output").text("jQuery is working!");
},
init: function() {
this.setupEvents();
}
};
});
[啊,燈泡](http://savorthesweetlife.files.wordpress.com/2012/07/lightbulb1-despicableme.jpg)。這在AMDSpecs中更有意義。我還將添加data-main,我使用單頁設置完成了這項工作,並且它運行良好,我遵循[此博客](http://www.novanet.no/no/blog/yngve-bakken-nilsen/dates/2013/6/making-requirejs-play-nice-with-aspnet-mvc /)讓它與MVC一起工作。不是說這是正確的;)。 – JabberwockyDecompiler
我在更新中提到我需要添加.js。我在這個段落中找到了api。 RequireJS默認也假設所有的依賴都是腳本,所以它不會在模塊ID上看到尾隨的「.js」後綴。當將模塊ID翻譯成路徑時,RequireJS會自動添加它。「這當然是他們告訴你要做的事情,並且一開始非常混亂。在單頁上我必須這樣做。但是我必須在MVC中添加擴展。 – JabberwockyDecompiler
您需要指定一個「.js」擴展名是可疑的。這對我來說早就是一個陷阱,因爲如果我包含它,腳本將不會被加載。 –