我需要对范围和模板执行一些操作.似乎我可以在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是无Angular 的世界.所以,我可以用$watch$digest$apply.

当我们已经有了控制器时,link函数的意义是什么?

推荐答案

initiallinkcontroller函数进行了一番斗争并阅读了大量关于它们的内容之后,我想现在我找到了答案.

先让understand

How do angular directives work in a nutshell:

  • 我们从模板开始(作为字符串或加载到字符串)

    var templateString = '<div my-directive>{{5 + 10}}</div>';

  • 现在,这个templateString被包装成一个angular element

    var el = angular.element(templateString);

  • 对于el,现在我们用$compile编译它,以获得link函数.

    var l = $compile(el)

    下面是发生的情况,

    • $compile遍历整个模板并收集它识别的所有指令.
    • 发现的所有指令都是compiled recursively,并收集了它们的link个函数.
    • 然后,所有link个函数都包装在一个新的link函数中,并作为l返回.
  • 最后,我们为这个l(link)函数提供了scope函数,这个l(link)函数用这个scope及其相应的元素进一步执行包装的link函数.

    l(scope)

  • 这会将template作为新 node 添加到DOM中,并调用controller,后者将其监视添加到与DOM中的模板共享的scope中.

在此处输入图像描述

比较compilelinkcontroller:

  • 每个指令只有一次compiledlink功能保留以供重复使用.因此,如果有适用于指令所有实例的内容,则应在指令的compile函数中执行.

  • 现在,编译后,我们有link个函数,在将template连接到DOM时执行.因此,我们执行特定于指令的每个实例的所有操作.例如:attaching eventsmutating the template based on scope等.

  • 最后,controller意味着在指令作用于DOM(连接后)时,它可以带电和react .因此:

    (1) 使用链接设置视图[V](即模板)后.$scope是我们的[M],$controllerM V C中的[C]

    (2) 通过设置手表,利用2-way$scope的绑定.

    (3) 预计控制器中会添加$scope个手表,因为这是在运行时监视模板的内容.

    (4)最后,controller还用于相关指令之间的通信.(例如https://docs.angularjs.org/guide/directive个示例中的myTabs个)

    (5)我们确实可以在link函数中完成所有这些操作,但大约是separation of concerns.

因此,我们终于有了以下完美契合所有部件的产品:

在此处输入图像描述

Javascript相关问答推荐

promise .all()永不解决

IOS(React Native)中未找到模块SquareReaderSDK

在shiny 模块中实现JavaScript

Javascript,部分重排序数组

通过嵌套模型对象进行Mongoose搜索

jQuery s data()[storage object]在vanilla JavaScript中?'

如何将react—flanet map添加到remixjs应用程序

使用POST请求时,Req.Body为空

将内容大小设置为剩余可用空间,但如果需要,可在div上显示滚动条

对路由DOM嵌套路由作出react

确保函数签名中的类型安全:匹配值

将Node.js包发布到GitHub包-错误ENEEDAUTH

如何在DYGRAPS中更改鼠标事件和键盘输入

JS Animate()方法未按预期工作

如何为仅有数据可用的点显示X轴标签?

使用jQuery find()获取元素的属性

使用Reaction窗体挂钩注册日历组件

JavaScript&;Reaction-如何避免在不使用字典/对象的情况下出现地狱?

如何在独立的Angular 应用程序中添加Lucide-Angel?

与在编剧中具有动态价值的定位器交互