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

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

阅读 19.7k
3 个回答

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

app.directive('myDirective', function factory(injectables) {

return {
    restrict: string,//指令的使用方式,包括标签,属性,类,注释
    priority: number,//指令执行的优先级
    template: string,//指令使用的模板,用HTML字符串的形式表示
    templateUrl: string,//从指定的url地址加载模板
    replace: bool,//是否用模板替换当前元素,若为false,则append在当前元素上
    transclude: bool,//是否将当前元素的内容转移到模板中
    scope: bool or object,//指定指令的作用域
    controller: function controllerConstructor($scope, $element, $attrs, $transclude){...},//定义与其他指令进行交互的接口函数
    require: string,//指定需要依赖的其他指令
    link: function postLink(scope, iElement, iAttrs) {...},//以编程的方式操作DOM,包括添加监听器等
    compile: function compile(tElement, tAttrs, transclude){
        return: {
            pre: function preLink(scope, iElement, iAttrs, controller){...},
            post: function postLink(scope, iElement, iAttrs, controller){...}
        }
    }
};

});

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