为什么有的要写在link里面,有的要写在controller里面?!
如果希望在module中设置一个子scope,但不用directive,这时候能否用link?
(比如说用ngRoute时候的ng-view部分,可否用link)
controller可以和服务器端通信是吧,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对象。
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){...}
}
}
};
});
关于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,可以是新创建的,也可以是已经存在的。