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

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

关于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,可以是新创建的,也可以是已经存在的。

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对象。

  • 如何修改$resource中已存在的header值?
  • angularJs里点击添加删除类
  • 关于angularjs中调用服务的方法的问题
  • angular js 实现购物车功能,怎么在不同的页面之间更新数据?
  • express如何接受angular 使用$http.post来的数据
  • ng-book中关于缓存结果的函数,是不是有问题?
  • vue中类似于angular的ng-change的指令是?
  • 如下的json数组,如何在angularjs中进行循环?
  • node.js中下载的angulae无法引入
  • 接口有三个输入参数。 其中有一个是数组。 用angular 怎么传啊
  • angular中ng-init中定义值在控制器里面获取不到值