我需要对范围和模板执行一些操作。似乎我可以在link
函数或controller
函数中执行此操作(因为两者都可以访问范围)。
什么时候需要使用link
功能而不是控制器?
angular.module('myApp').directive('abc', function($timeout) {
return {
restrict: 'EA',
replace: true,
transclude: true,
scope: true,
link: function(scope, elem, attr) { /* link function */ },
controller: function($scope, $element) { /* controller function */ }
};
}
另外,我知道那link
是非角度的世界。所以,我可以使用$watch
,$digest
和$apply
。
link
当我们已经有了控制器时,该功能的意义是什么?
在与和函数进行 最初的 斗争并阅读了很多有关它们的内容之后,我认为现在我有了答案。link``controller
首先让 理解 ,
简而言之,角度指令如何工作:
var templateString = '<div my-directive>{{5 + 10}}</div>';
templateString
其包装为 角形元素var el = angular.element(templateString);
el
,现在我们用$compile
进行编译,以获取 链接 功能。var l = $compile(el)
这是发生了什么事
* `$compile` 遍历整个模板并收集其识别的所有指令。
* 所发现的所有指令均以 **递归** 方式 **编译** 并`link`收集其功能。
* 然后,所有`link`函数都包装在一个新`link`函数中,并以形式返回`l`。
scope
为该l
(链接)函数提供函数,该函数进一步使用this scope
和它们的相应元素执行包装的链接函数。l(scope)
template
作为新节点添加到,DOM
并进行调用controller
,这会将其监视添加到与DOM中的模板共享的 范围 。比较 compile vs link 和 controller :
每个指令只能 编译 一次, 链接 功能将保留以供重复使用。因此,如果某条指令适用于指令的所有实例,则应在指令的compile
功能内执行。
现在,在编译之后,我们有了link
将 模板 附加到 DOM时 执行的功能。因此,因此我们执行特定于指令每个实例的所有操作。例如: 附加事件 , 基于范围更改模板 等。
最后,当指令在上运行时(附加后),该 控制器 应处于活动状态和反应状态DOM
。因此:
(1)设置带有链接的视图[ V* ](即模板)后。$scope
是我们的[ M ],$controller
也是我们在 MVC中的
[ C ]
*
(2)通过设置手表 来 利用 $ scope 进行 2向 绑定。
(3)$scope
期望在控制器中添加监视,因为这是在运行时监视模板。
(4)最后,controller
还用于能够在相关指令之间进行通信。(myTabs
例如https://docs.angularjs.org/guide/directive中的示例)
(5)的确,我们也可以在link
函数中完成所有这些操作,但它只 涉及关注点分离 。
问题内容: 我可能会考虑将其完全倒退,但是我正在尝试制作三个嵌套指令,让它们称为:屏幕,组件和小部件。我希望窗口小部件能够触发组件中的某些行为,从而触发屏幕中的某些行为。所以: 我可以使用来在小部件的链接fn中要求父组件,但是如何进一步使组件控制器访问其包含的屏幕呢? 我需要的是WHAT in组件,因此,当您单击小部件的按钮时,它会发出“ screeny!”警报。 谢谢。 问题答案: 您可以通过以
问题内容: 我已经仔细阅读了有关该主题的 AngularJS 文档,然后摆弄了一条指令。这是jsfiddle。 以下是一些相关的摘要: 从 HTML : 从窗格指令: 我没有几件事: 为什么必须与和一起使用? 我是否还可以直接访问父范围,而不用属性装饰元素? 该文档说: “通常希望通过表达式将数据从隔离的范围传递到父范围” ,但这似乎也可以与双向绑定一起使用。为什么表达途径会更好? 我发现了另一个
问题内容: 也许我对指令控制器的工作原理有一个基本的误解,据我了解,它们被用作暴露给其他指令和控制器的一种API。我正在尝试使控制器和链接功能进行内部通信。 例如,我希望能够通过控制器函数设置一个变量,然后在链接函数中使用它: 如何在链接功能中访问myVar或sayHi?还是我完全错过了重点? 问题答案: 控制器的$ scope(在控制器中定义,而不在函数中定义)和链接都相同。可以从链接中使用在控
问题内容: 我听说将语法和使用隔离范围的in指令一起使用是一种好习惯。参考文献:一,二 假设我有一个这样的指令: 如您所见,该指令中没有控制器。但是,为了能够发挥作用,我必须拥有一个控制器。 将链接功能转换为控制器的最佳实践是吗? 我的理解是,指令的控制器应该用作公开指令与指令通信的指令API的机制。 考虑到Angular 2.0,有人能阐明这些天的最佳做法吗? 问题答案: 我认为最好的做法是在指
我仔细阅读了关于这个主题的AngularJS文档,然后随意修改了一个指令。小提琴在这里。 下面是一些相关的片段: > 来自HTML: 在窗格指令中: 有几件事我不明白: 为什么必须使用与和与? 是否也可以直接访问父范围,而不使用属性装饰元素? 文档说“通常希望通过表达式将数据从独立作用域传递到父作用域”,但这似乎也适用于双向绑定。为什么表达式路由会更好? 我找到了另一个显示表达式解的fiddle:
问题内容: 我创建了一个包装jQuery插件的指令,并将该插件的配置对象从控制器传递到指令。(作品) 在配置对象中是一个我想在事件上调用的回调。(作品) 在回调中,我想修改控制器的$ scope上的属性,该属性 不起作用 。Angular无法识别出该属性由于某种原因而发生了变化,这使我相信回调中的$ scope与控制器的$ scope不同。我的问题是我不明白为什么。 有人能指出我正确的方向吗? 单