当前位置: 首页 > 面试题库 >

Angular JS:当我们已经有了带范围的指令控制器时,指令的链接功能有什么需求?

姜鸿
2023-03-14
问题内容

我需要对范围和模板执行一些操作。似乎我可以在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 linkcontroller

  • 每个指令只能 编译 一次, 链接 功能将保留以供重复使用。因此,如果某条指令适用于指令的所有实例,则应在指令的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:

  • 问题内容: AngularJS指令的默认作用域值是什么? 当然,它不是孤立的范围。这是对还是错。 我找不到有关它的任何文档。 问题答案: “请注意,默认情况下,伪指令不会创建新的作用域-即,默认值为” 从理解范围。 使用指令中的scope选项,您可以: 创建一个原型继承的子范围 创建一个独立的作用域,然后您可以将某些属性绑定到父作用域。 决定不创建新的作用域,并使用父级(默认)。