gpt4 book ai didi

asp.net-mvc-4 - 关于 mvc、require.js 和 Angular 的童话。以后还有幸福吗?

转载 作者:行者123 更新时间:2023-12-02 20:51:50 26 4
gpt4 key购买 nike

所以。曾几何时,有四种神奇的生物:asp.net mvc、require.js 和 Angular。一位聪明的巫师决定将它们放在同一栋房子里,并让 ASP.NET 的每个 View 都有自己的“代码隐藏”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 中的一个 javascript 文件,名为controllerName-viewName.js,则为 Home\Index.cshtml 的 home-index.js 。会被 require.js 自动获取并加载。很漂亮不是吗?

但是魔术师想:如果我需要加载其他东西(例如 ng-grid)并且某些东西不应该注入(inject)到公共(public) Angular 模块中怎么办,因为并非所有页面都会使用它。当然,他总是可以在他需要的每个代码隐藏 javascript 中手动将另一个模块引导到页面元素中,但他不够明智,无法找到问题的答案:是否可以将一些 angular.js 组件(如 ng-grid)直接注入(inject) Controller 中,而不将其作为应用程序模块的一部分?

最佳答案

如果我理解魔术师的想法是正确的,那么可以将您的应用程序拆分为定义为组件集合的子模块。

如果他为主 myApp 模块设置依赖项,它将起作用,例如:

var myApp = angular.module('myApp', ['Constants', 'Filters', 'Services', 'Directives', 'Controllers']);
myApp.Constants = angular.module('Constants', []);
myApp.Controllers = angular.module('Controllers', []);
myApp.Filters = angular.module('Filters', []);
myApp.Services = angular.module('Services', []);
myApp.Directives = angular.module('Directives', []);

然后每个子模块:服务等 - 可以使用单个组件进行扩展,例如:

myApp.Controllers.controller('MyController', function () {});
myApp.Services.factory('myService', function () {});
myApp.Directives.directive('myDirective', function () {});
myApp.Filters.filter('myFilter', []);
myApp.Constants.constant('myConstant', []);

这样主应用程序模块会加载多个子模块,但每个结构并不重要。它可以在后端提供的每个页面上包含单独的 Controller 、服务、指令和过滤器 - 魔术师只需确保加载所有需要的依赖项。

关于asp.net-mvc-4 - 关于 mvc、require.js 和 Angular 的童话。以后还有幸福吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15663032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com