的controller
功能/对象表示一个抽象模型-视图-控制器(MVC)。尽管没有什么新的关于MVC的文章可以写,但是它仍然是angular的最重要的优势:将关注点分成更小的部分。就是这样,仅此而已,因此,如果您需要对Model
来自View
的更改做出反应,则Controller
是合适的人来完成这项工作。
关于link
功能的故事是不同的,它与MVC来自不同的角度。一旦我们想跨越controller/model/view
(模板)的边界,这真的很重要。
让我们从传递给link
函数的参数开始:
function link(scope, element, attrs) {
- scope是Angular作用域对象。
- element是此伪指令匹配的jqLite包装的元素。
- attrs是具有规范化属性名称及其对应值的对象。
要把link
上下文放到上下文中,我们应该提到所有指令都通过了初始化过程:Compile,Link。Brad Green和Shyam Seshadri的《 Angular JS》摘录:
编译阶段(链接的姐妹,让我们在这里提到它以获得清晰的图片):
在此阶段,Angular遍历DOM以标识模板中所有已注册的指令。然后,对于每个指令,它根据指令的规则(模板,替换,转写等)转换DOM,并调用编译函数(如果存在)。结果是一个编译的模板函数,
链接阶段:
为了使视图动态化,Angular然后为每个指令运行一个链接函数。链接功能通常在DOM或模型上创建侦听器。这些侦听器始终保持视图和模型同步。
link
可以在这里找到如何使用的一个很好的示例:创建自定义指令。请参见示例:创建处理DOM的指令,该指令将“日期时间”插入页面,并且每秒刷新一次。
上面的丰富资源中仅一小段,显示了DOM的实际操作。$ timeout服务有钩子函数,并且在其析构函数调用中将其清除以避免内存泄漏
.directive('myCurrentTime', function($timeout, dateFilter) {
function link(scope, element, attrs) {
...
// the not MVC job must be done
function updateTime() {
element.text(dateFilter(new Date(), format)); // here we are manipulating the DOM
}
function scheduleUpdate() {
// save the timeoutId for canceling
timeoutId = $timeout(function() {
updateTime(); // update DOM
scheduleUpdate(); // schedule the next update
}, 1000);
}
element.on('$destroy', function() {
$timeout.cancel(timeoutId);
});
...
$watch
,$digest
和$apply
。 ”?