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

在同一指令的链接功能内使用指令控制器中的功能

傅志诚
2023-03-14
问题内容

也许我对指令控制器的工作原理有一个基本的误解,据我了解,它们被用作暴露给其他指令和控制器的一种API。我正在尝试使控制器和链接功能进行内部通信。

例如,我希望能够通过控制器函数设置一个变量,然后在链接函数中使用它:

var app = angular.module('test-app', []);

app.directive('coolDirective', function () {
    return {
        controller: function () {
            this.sayHi = function($scope, $element, $attrs) {
                $scope.myVar = "yo"
            }
        },
        link: function(scope, el, attrs) {
            console.log(scope.myVar);
        }   
    }
});

如何在链接功能中访问myVar或sayHi?还是我完全错过了重点?


问题答案:

控制器的$ scope(在控制器中定义,而不在sayHi函数中定义)和链接scope都相同。可以从链接中使用在控制器中设置的内容,反之亦然。

您遇到的问题sayHi是该函数永远不会触发,因此myVar永远不会设置。

由于sayHi不在范围内,因此需要引用控制器并执行该操作,因此可以添加第四个参数,如下所示:

link: function(scope, element, attr, ctrl) {}

然后,您可以做一个ctrl.sayHi()(但同样,那些参数sayHi属于控制器功能。)

如果您需要另一个控制器,但仍想使用其自己的指令,那么您也将需要它。因此,如果coolDirective需要访问您的控制器,notCoolAtAll可以执行以下操作:

require: ['coolDirective', 'notCoolAtAll']

这样就可以了。link然后,该函数将接收一个控制器数组作为第四个参数,在这种情况下,第一个元素为coolDirectivectrl,第二个元素为ctrl
notCoolAtAll

这是一个小例子:http :
//plnkr.co/edit/JXahWE43H3biouygmnOX?p=preview



 类似资料:
  • 问题内容: 我听说将语法和使用隔离范围的in指令一起使用是一种好习惯。参考文献:一,二 假设我有一个这样的指令: 如您所见,该指令中没有控制器。但是,为了能够发挥作用,我必须拥有一个控制器。 将链接功能转换为控制器的最佳实践是吗? 我的理解是,指令的控制器应该用作公开指令与指令通信的指令API的机制。 考虑到Angular 2.0,有人能阐明这些天的最佳做法吗? 问题答案: 我认为最好的做法是在指

  • 问题内容: 在我的某些指令中,我正在向作用域添加函数以处理特定于该指令的逻辑。例如: 我该如何测试该功能?我到处搜索如何测试指令,但是发现的更多内容是测试元素上的更改。我当然可以在每次测试之前编译指令,但是每次都会覆盖我的范围。我想在我的范围更改属性时测试该功能。 有什么方法可以保留从指令定义返回的对象吗?然后,我可以直接调用链接函数并测试作用域上定义的每个函数的行为。有没有更好的方法来完成所有这

  • 问题内容: 我正在尝试创建一条指令,该指令允许将元素定义为可点击或不可点击,并且将被定义为: 我希望生成的HTML是: 我的指令实现如下所示: 我可以看到,添加新属性后,Angular不了解,因此不会触发。我尝试在设置属性后添加一个,但它会导致无限的链接/编译循环。 我知道我可以只检查函数中的值是否为,但是我很好奇如何动态添加事件来执行此操作,因为我可能需要使用多个其他指令来执行此操作,而我不想这

  • 问题内容: 我可能会考虑将其完全倒退,但是我正在尝试制作三个嵌套指令,让它们称为:屏幕,组件和小部件。我希望窗口小部件能够触发组件中的某些行为,从而触发屏幕中的某些行为。所以: 我可以使用来在小部件的链接fn中要求父组件,但是如何进一步使组件控制器访问其包含的屏幕呢? 我需要的是WHAT in组件,因此,当您单击小部件的按钮时,它会发出“ screeny!”警报。 谢谢。 问题答案: 您可以通过以

  • 问题内容: 尝试在指令的链接函数中使用与号&来调用传递给指令的函数时遇到问题。 似乎在控制器上调用了该函数,但在调用中未传递任何参数。我们看到的所有示例都涉及通过在模板中创建调用来进行传递。有没有一种方法可以从其模板的指令中调用指令中的函数,然后在指令中执行某些操作,以调用传递给它的控制器函数? 问题答案: 您是否在s中传递了参数?例如,在指令的链接函数中,您将希望像这样调用方法: jsfiddl

  • 问题内容: 我需要对范围和模板执行一些操作。似乎我可以在函数或函数中执行此操作(因为两者都可以访问范围)。 什么时候需要使用功能而不是控制器? 另外,我知道那是非角度的世界。所以,我可以使用,和。 当我们已经有了控制器时,该功能的意义是什么? 问题答案: 在与和函数进行 最初的 斗争并阅读了很多有关它们的内容之后,我认为现在我有了答案。 首先让 理解 , 简而言之,角度指令如何工作: 我们从模板开