AngularJS中指令的link、控制器、service三者有何区别?

最近刚学AngularJS,用到$http异步加载后台数据,自己写的时候想当然直接写在了link里面,比如单击按钮加载数据,后来发下控制器、service都可以用来操作DOM,那么,这三者究竟有何区别?我写一些逻辑的时候究竟该放在哪个里面?

阅读 3.7k
3 个回答

首先说明下 angular体系中是没有link这个东西的 题主说的link 是 directive中的link对吧.
这个三个angular 组件分别有自己的作用.
controller:主要是处理与界面进行交互的部分以及一些逻辑处理. controller 在每次界面引用的时候创建.
service : 会在项目启动的时候进行创建,也就是说 service在系统中是单例的.一般会进行数据存储,和系统级的服务.其实还有 factory,provider 可以去了解下.
directive: 个人认为主要是为了写html插件和操作html使用的.一般了解了directive 基本angular就没什么问题了.

个人理解, 勿喷.

angularjs 并不提倡 直接操作DOM。所以,但凡是你想操作DOM的步骤,一般都可以转化为angular的方式来进行。但是实在想操作一些的话,在你说的三个东西中,link是最合适的。
angular中全局方法 angular.element()等同于$(),方便你的DOM操作,但是在没有引入jquery的前提下,它的功能绝对不如jQuery强大。

另外,说一下三者的区别。 我们经常把数据处理逻辑写入controller中,一些可以可复用的代码写入service。比如向后端的http请求。link则是指令的一部分,指令的存在的目的也是代码的可复用。总而言之,无论service还是指令,目的都是为了前端开发的组件化,代码可复用。
在不熟悉的情况下,可以尝试把代码都放在controller中。

给你举一个例子你就明白了

jQuery思维方式:

angular.element(dom).addClass('someClass');

Angular思维方式:
view:

<div ng-class="{ someClass : someCondition }"></div>

controller:

$scope.someCondition = condition ? true : false;

补充:

controller: 顾名思义,控制逻辑的地方,你模块中的所有业务代码基本都在这里,这里只负责和后端进行数据交互。
service: 你说的 $http 就是Angular封装好的服务,它既然是服务,当然是在项目的任意地方都可以随时拿来用,这类代码都会封装成服务。
link: 没有link这个服务或指令, link是指令里的链接函数,你可以理解为将控制代码和dom进行链接的地方。
指令这个部分,我建议LZ专门抽空去单独了解一下。而且至少是在理解了Angular思维方式以后,否则很容易把指令当成jQuery的容器……

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题