そう。むかしむかし、asp.net mvc、require.js、angular という 4 つの魔法の生き物がありました。そして、ある賢明な魔法使いは、それらを同じ家に置き、asp.net のすべてのビューに独自の「コード ビハインド」javascript ファイルを持たせることにしました。
最初に彼は_Layout.cshtml
<script data-main="/main" src="~/Scripts/require.js"></script>
そして、彼main.js
はルートで作成しました:
require.config({
baseUrl: "/Scripts/",
paths: {
'jquery': 'jquery-1.9.1.min',
'jquery-ui': 'jquery-ui-1.10.2.custom.min',
'angular': 'angular.min',
'ng-grid': 'ng-grid-2.0.2.debug'
},
shim: {
'jquery': { exports: "$" },
'underscore': { exports: "_" },
'jquery-ui': ['jquery'],
},
});
// Standard Libs
require(['jquery','jquery-ui','underscore','angular']);
空想的で魔法のようなものはまだありません。しかし、彼は次のような html ヘルパーを作成しました。
public static MvcHtmlString RequireJs(this HtmlHelper helper)
{
var controllerName = helper.ViewContext.RouteData.Values["Controller"].ToString(); // get the controllername
var viewName = Regex.Match((helper.ViewContext.View as RazorView).ViewPath, @"(?<=" + controllerName + @"\/)(.*)(?=\.cshtml)").Value; //get the ViewName - extract it from ViewPath by running regex - everything between controllerName +slash+.cshtml should be it;
// chek if file exists
var filename = helper.ViewContext.RequestContext.HttpContext.Request.MapPath("/Scripts/views/" + controllerName.ToLower() + "-" +
viewName.ToLower()+".js");
if (File.Exists(filename))
{
return helper.RequireJs(@"views/" + controllerName.ToLower() + "-" + viewName.ToLower());
}
return new MvcHtmlString("");
}
public static MvcHtmlString RequireJs(this HtmlHelper helper, string module)
{
var require = new StringBuilder();
require.AppendLine(" <script type=\"text/javascript\">");
require.AppendLine(" require(['Scripts/ngcommon'], function() {");
require.AppendLine(" require( [ \"" + module + "\"] );");
require.AppendLine(" });");
require.AppendLine(" </script>");
return new MvcHtmlString(require.ToString());
}
_Layout.cshtml
そして、彼はそれを次のように使用できます。
@Html.RequireJs()
Scripts/ngcommon.js
話を注意深く聞いていれば、 angular.js を手動でブートストラップするためのファイルもあり、Angular ディレクティブとサービスを一般的に使用していることに気付いたでしょう。
require(['angular', 'jquery'], function() {
angular.module("common",[]).directive('blabla', function() {
return {
restrict: 'A',
scope: { value: "@blabla" },
link: function(scope, element, attrs) { }
}
});
//manually bootstrap it to html body
$(function(){
angular.bootstrap(document.getElementsByTagName('body'), ["common"]);
});
});
ここで魔法が起こります。これ以降、これが \Scripts\views にある controllerName-viewName.js という名前の JavaScript ファイルであった場合、home-index.js
Home\Index.cshtml と同様に、require.js によって自動的に取得されて読み込まれます。美しいですね。
しかし、マジシャンは次のように考えました: 何か他のもの (ng-grid など) をロードする必要があり、すべてのページがそれを使用するわけではないため、共通の angular モジュールに何かを注入する必要がない場合はどうでしょうか。もちろん、彼は必要に応じて、各コード ビハインド JavaScript のページ要素に別のモジュールを手動でいつでもブートストラップできますが、次の質問に対する答えを見つけるほど賢明ではありません 。 ) アプリ モジュールの一部として持たずに、コントローラーに直接入れますか?