首页 > directive里的link和controller区别?非directive的scope能否用link?

directive里的link和controller区别?非directive的scope能否用link?

为什么有的要写在link里面,有的要写在controller里面?!
如果希望在module中设置一个子scope,但不用directive,这时候能否用link?
(比如说用ngRoute时候的ng-view部分,可否用link)
controller可以和服务器端通信是吧,link好像不干这事情?还是只是我没见到过?


link 和 controller 是完全不相干的概念。

对于一个特定的drective, controller可以是没有的, link比较复杂,基本上可以看做是$compile的一个回调 angularjs 对于drictive 必须是首先编译 ---> 调用$compile生成dom对象---> 调用link绑定到相应scope ---> 触发 $digest (之后还有好多步骤,才能更新一个driective, 不同对象的编译次数和时机都不一样,具体去看api)

总之 compile, link 之类都是针对driective来说的,如果题主对jquery熟的话,那么compile过程就相当于 创建一些dom对象( $('<a class = //.... ') ) link则是$().append or prepend 之类的dom操作。

那么scope是啥? scope是绑定模型用的。
controller是啥? 给scope 加上方法(逻辑)用的。

link 是用来把directive嵌入dom的angularjs提供的一个切面机制, controller 是 scope中watch的事件被触发时的context, 完全不同的东西。

针对最后一个问题, 只要是可以运行的函数都能执行你写的代码,但是一般来说
1) 把你的业务逻辑写在controller里, 而且不要写在driective自己的controller里, 而是在它绑定的scope的那个controller上

2) controller里面别出现dom操作,特别是prepend,append 这些, 因为未被编译过的dom对象是没法被watch的, angularjs不会监视那些后来加入又没有被编译过的dom对象。


关于directive里的link和controller区别?
1、执行顺序:先controller后link
2、何时使用controller:一般场景下都不想要使用controller,只需要把逻辑写在link中就可以了;用controller的场景就是该指令(假设为a)会被其他指令(假设为b)require的时候,这样就会在b指令的link函数中传入这个controller(如果require多个的话,传入的是一个数组,数组中存放的是每一个require的指令对应的controller),目的很显然是为了指令间进行交流的。

关于非directive的scope能否用link?
在指令中才存在调用link的时候,也就是说link是该指令在compile之后和scope进行绑定的时候调用的。
那只有在指令定义的那个地方用到link了,其他地方也可以用,例如做弹出框的时候就需要,拿到模板tpl,然后调用var linkFn = $compile(angular.element(tpl));此时返回的就是一个link的函数,然后linkFn(scope),这里的scope是你需要指定的scope,可以是新创建的,也可以是已经存在的。

【热门文章】
【热门文章】