AngularJS 初印象------对比 Asp.net MVC
之前就早耳闻前端MVC的一些框架,微软自家的Knockout.js,google家的AngularJs,还有Backone。但未曾了解,也不解为什么前端也要这么分。这两天看了AngularJs的官方教程倒是吃了一惊(专业前端的就不要见怪我的out了),这小小的js,五脏俱全,不但有model,controller,view,这三个重要元素,还有Templates,Filter,Routing,依赖注入的DI都有,还有一套 Jasmine 框架下的单元测试!心里一想这javascript前后都搞定了嘛,也许这样的“轻装上阵”就是促成SPA流行的一个重要原因吧。
我们来对比一下AngularJs的MVC(其实更偏向于MVVM)和Asp.Net MVC 。给我一样的奥特曼(out man)认识下。
先看几段AngularJs的代码。
<html ng-app="phonecatApp"> //除了申明这是一个AngularJS 应用之外,会创建全局的root scope,这个就相当于Asp.net MVC中繁多的context
<head>
...
<script src="../bower_components/angular/angular.js"></script>
<script src="js/controllers.js"></script>
</head>
<body ng-controller="PhoneListCtrl">// 这里就是声明,这个body范围类的都是PhoneListCtrl这个Controller的控制范围。
Search: <input ng-model="query"> // 定义query是一个模型,
<ul>
<li ng-repeat="phone in phones| filter:query">//这里phones 也是一个model。 而这个ng-repeat就相当于Asp.net MVC中cshtml中的foreach语法。但这个filter又不是Asp.net MVC中用于AOP的Filter,这里就是作为过滤的一个条件。
{{phone.name}}//双大括号表示这里是和模型中的数据绑定的。 相当于Asp.net MVC 中的@符号
<p>{{phone.snippet}}</p>
</li>
(对比图)
</ul>
</body>
</html>
//controllers.js
var phonecatApp = angular.module('phonecatApp', []);
phonecatApp.controller('PhoneListCtrl', function ($scope) {//这里就把phonecatApp这个应用和控制器PhoneListCtrl关联了起来,并负责把模型数据赋值给$scope.这个
$scope 就是上面提到的context,带有$都是表示Angular提供的Services,这里作为参数传递进来,就应用了AngularJs的DI。
$scope.phones = [
{'name': 'Nexus S',
'snippet': 'Fast just got faster with Nexus S.'},
{'name': 'Motorola XOOM™ with Wi-Fi',
'snippet': 'The Next, Next Generation tablet.'},
{'name': 'MOTOROLA XOOM™',
'snippet': 'The Next, Next Generation tablet.'}
];
});
当然也可以通过请求的方式获取数据
phonecatApp.controller('PhoneListCtrl',function($scope, $http){//这里也是用了DI
$http.get('phones/phones.json').success(function(data){
$scope.phones = data;
});
AngularJs的DI,倒是很像Asp.Net MVC 模型绑定,不像我们平时在面向对象中的DI/IOC,都是通过一个属性或者接口进行注入,而达到解耦的目的。但它的注入器injector,是在应用被加载的时候就被创建的,它的职责就是加载指定模块,以及这个模块中定义的所有服务(service 像$http,$localtion,$route)的提供者(provider),当对象被请求时,就调用这些provider的方法来实现这些service,而且provider提供配置的api来控制service,这样看来就有DI的味道了。有更详细的解释 Understanding Dependency Injection.
一个应用的模型都是存在于$scope中的,$scope 用官网的原话就是 它像胶水一样,让模板,模型和控制器一起工作,而且让他们保持分离但同步,模型的改变会映射到视图上,视图的改变也会反映到模型上。
看到就是这样的一个效果,没有其他代码,在输入框中输入字符,就能对右边的内容进行检索,并实时更新。query这个模型改变,影响了phones这个模型值的改变,导致看到不同的结果。

图一

图二
整个机制如下:

这一点倒是让我眼前一亮。效果很像JqueryUi里面的autocomplete. bootstrap里面的typeahead ,但更灵活了。排序什么的就很简单。filter后面跟对应的属性就行了。
(bootstrap2 typeahead)
再简单的看看它的路由
phonecatApp.config(['$routeProvider',
function($routeProvider) {
$routeProvider.
when('/phones', {
templateUrl: 'partials/phone-list.html',//相当于分布式图
controller: 'PhoneListCtrl' //控制器
}).
when('/phones/:phoneId', {
templateUrl: 'partials/phone-detail.html',
controller: 'PhoneDetailCtrl'
}).
otherwise({
redirectTo: '/phones'
});
}]);
对比Asp.net MVC的路由设置
context.MapRoute(
null,
"RemoteData",//
new { controller = "RemoteData", action = "Data" }//name = UrlParameter.Optional
);
context.MapRoute(
null,
"FileManager/{action}",
new { controller = "FileManager", action = "Index" }
);
//....
这个when的写法让人心存忌讳。有些像if语句了。还是倾向于Asp.net MVC,只写你特定的规则就行了,不必一个一个url的去对应。最后用一张图简单的总结下,当然这么做是不完全正确的。毕竟我对AngularJs了解不够深,又是不同层面的语言。对比也不是要拿谁把谁比下去。

主要是想做个参照,看彼此代码的时候联系起来就容易理解一些。因为这些天看到BlogEngine源码中,前端UI的部分用到了AngularJs,当时就看得有点傻,这才了解AngularJs的。到现在觉得,AngularJs 非常不同于Jquery,Kendo,Bootstrap这些同样基于Javascript的专门处理UI的前端类库,而是一个轻量级的MVC/MVVM开发框架,更关注于模型的改变,数据格式是Json。不用其他的高级语言,也能开发出一个完整的应用;这种绑定机制可以很便捷的实现一些功能。至于SEO,google创造了它,问google吧。 我是觉得SEO只是辅助,先是技术发展,规范形成,再是SEO如何去匹配这种技术。只是当下对SEO会有些些不友好。
本文就到这里,希望对你有帮助,我的理解有限,欢迎拍砖。:)
AngularJS 初印象------对比 Asp.net MVC的更多相关文章
- AngularJS and Asp.net MVC
AngularJS 初印象------对比 Asp.net MVC 之前就早耳闻前端MVC的一些框架,微软自家的Knockout.js,google家的AngularJs,还有Backone.但未曾了 ...
- AngularJS2 + ASP.NET MVC项目
环境:VS2015, NodeJS:v 6.5, npm: v3.10, AngularJs 2 通过将ASP.NET MVC项目与Angualr 2官网上的quick start整合的过程中遇到些问 ...
- ASP.NET MVC 的 WebGrid 的 6 个重要技巧 【已翻译100%】
ASP.NET MVC 中 WebGrid 的 6 个重要技巧 https://www.oschina.net/translate/webgrid-in-asp-net-mvc-important-t ...
- 7 天玩转 ASP.NET MVC — 第 1 天
0. 前言正如标题「7 天玩儿转 ASP.NET MVC」所言,这是个系列文章,所以将会向大家陆续推出 7 篇.设想一下,一天一篇,你将从一个愉快的周一开始阅读,然后在周末成为一个 ASP.NET M ...
- 7 天玩转 ASP.NET MVC - 第 1 天
0. 前言 正如标题「7 天玩儿转 ASP.NET MVC」所言,这是个系列文章,所以将会向大家陆续推出 7 篇.设想一下,一天一篇,你将从一个愉快的周一开始阅读,然后在周末成为一个 ASP.NET ...
- 在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下:
Asp.net MVC中的ViewData与ViewBag ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从Asp.net MVC 1 就有了 ASP. ...
- ASP.NET MVC和EF集成AngularJS开发
参考资料: 如何在ASP.NET MVC和EF中使用AngularJS AngularJS+ASP.NET MVC+SignalR实现消息推送 [AngularJs + ASP.NET MVC]使用A ...
- 如何在 ASP.NET MVC 中集成 AngularJS(3)
今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...
- 如何在 ASP.NET MVC 中集成 AngularJS(2)
在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...
随机推荐
- MySQL Innodb的两种表空间方式
要说表空间,MySQL的表空间管理远远说不上完善.换句话说,事实上MySQL根本没有真正意义上的表空间管理.MySQL的Innodb包含两种表空间文件模式,默认的共享表空间和每个表分离的独立表空间.只 ...
- Quartus中添加时序约束
1.sdc文件也是要添加到Quartus 软件中,这样在执行Read SDC File命令时才能读到相应的文件. 2.在TimeQuest打开的条件下,重新编译工程之后要Update Timing N ...
- ios 更新约束
[view setNeedsUpdateConstraints]; [view updateConstraintsIfNeeded]; [view setNeedsLayout]; ...
- DevOps的修炼之路!
作为一名产品经理,首先要知道产品对于所属公司来说意味着什么,要探寻这个问题,我们又得知道和公司息息相关的是什么,在我的理解来看,与公司状况相关的因素有以下这些: 市场份额 平均订单金额 盈利能力 资产 ...
- Centos7 php 5.6.19编译安装
0x01 前言 在php官网下载php-5.6.19.tar.gz源代码(php7虽然说性能提升很大,但是小菜菜还是先用着这个先吧),解压后根目录有个INSTALL文件,里面有安装教程了,目录如下: ...
- 使用commons-logging和log4j记录日志
一,为什么要使用commons-logging+log4j? commons-logging和log4j都是Apache下的开源项目.commons-logging的目的是为“所有的Java日志实现” ...
- MVC 路由模块内核原理
.net网站第一次运行的时候 执行global文件的application_start方法 注册路由信息 RouteConfig.RegisterRoutes(RouteTable.Routes) ...
- Maven学习之 仓库镜像
使用仓库镜像 仓库可以声明在项目中,但有时,你可能想要使用某个仓库的镜像,而不去修改项目文件. 使用镜像的原因: 有一个同步镜像,且速度更快. 想使用你自己控制的内部仓库. 想运行repository ...
- 【Java学习笔记】泛型
泛型: jdk1.5出现的安全机制 好处: 1.将运行时期的问题ClassCastException转到了编译时期. 2.避免了强制转换的麻烦. <>: 什么时候用? 当操作的引用数据类型 ...
- Mysql --分区(3)range分区
3.分区类型 RANGE分区 按照range分区的表是利用取值范围将数据分成分区,区间要连续并且不能互相重叠,使用values less than操作符进行分区定义 CREATE TABLE tnp ...