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

控制器内部指令的行为

沙星波
2023-03-14
问题内容

我知道a中$scope的a controller可以共享到中的链接函数directives

例如,在这段代码中,我可以从已声明的控制器调用一个函数,以在浏览器控制台上打印“ Hello World”:

 .directive('myDirective', [function () {
        return {
            restrict : 'E',
            replace : true,
            controller: 'MyController',
            templateUrl : 'directives/myDirective.tpl.html',
            link : function (scope, elem, attrs, controller) {
                scope.message = 'Hello World!';
            }
        };
    }])

    .controller('MyController', [function ($scope, $element, $attrs, $log, $timeout) {

        // $timeout to wait the link function to be ready.
        $timeout(function () {
            // This prints Hello World as expected.
            $log.debug($scope.message);
         });


        });
    }])

好的,这很好。

我的问题是

  1. 在这种方法中,控制器和指令之间共享的是 SAME 范围吗?
  2. 使用这种方法会有什么后果?让我们假设我 不会 仅在中操纵DOM元素。controller``link function
  3. 我真的需要避免在此操作DOM元素controller吗?即使$scope$elem等都是一样的吗?

这些是我在Angular Directive文档中找不到的问题。

这是一个带有示例代码的插件。


问题答案:

在这种方法中,控制器和指令之间共享的是SAME范围吗?

是的。

使用这种方法会有什么后果?让我们假设我不会仅在链接函数中操作控制器中的DOM元素。

就像常规的Angular应用程序一样,控制器负责提供指令的行为。就是说,您应该只在控制器函数内部操作范围。如果需要通过链接函数更改范围,请调用它的方法。此外,由于控制器是在链接功能之前执行的,因此您应该在前者中初始化作用域,以便后者可以使用有效的模型进行工作。

我真的需要避免在此控制器中操纵DOM元素吗?即使$ scope,$ elem等相同?

根据定义,链接功能是执行DOM操作的地方。我找不到能阻止您在指令的控制器内操作DOM的技术原因,除非您不应该这样做。实际上,为了检查我是否刚刚更改了一条指令,我编写了所有代码并将其从链接功能移至控制器功能,并且一切正常。但是,如果将范围逻辑和DOM操作混合在一起,我认为很难跟踪正在发生的事情。

最后,您可能会发现本文很有用:了解指令。



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

  • 问题内容: 我正在尝试从指令内部监视控制器的角度。 小提琴:http : //jsfiddle.net/dkrotts/TfTr5/5/ 照原样,$ watch函数不能从控制器内部捕获2秒后完成的模型更改。我想念什么? 问题答案: 接受要在作用域中监视的属性的“名称”,即要求它监视值。现在将其更改为观看返回“ bar”的手表。您可以按原样或使用的方式获取值,就像再次说出的那样,与相同。 为了澄清u

  • 问题内容: 我正在尝试使用AngularJS创建我的第一个应用程序。但是,如果我需要针对特定​​情况使用指令,我会感到困惑。 我有一个简单的“地图”页面,需要在其中显示所选区域的纬度/经度值。目前,我根本没有使用指令。我在控制器中执行所有操作,并使用局部显示结果。我不打算在其他任何地方重用我的地图视图。这就是为什么我不觉得我需要指令。 另一方面,我读到某个地方,每次您尝试在控制器中操作DOM(我正

  • 问题内容: 因此,我确实看到了另一个问题:如何在指令UT中模拟所需的指令控制器,这基本上是我的问题,但似乎该线程的答案是“更改设计”。我想确保没有办法做到这一点。我有一个指令声明一个由子指令使用的控制器。我现在正尝试为children指令编写茉莉花测试,但由于它们依赖于控制器,因此我无法让它们在测试中进行编译。看起来是这样的: 子指令: 茉莉花测试: 我没有办法用茉莉花测试子指令吗?如果可以,我会

  • 问题内容: 也许我对指令控制器的工作原理有一个基本的误解,据我了解,它们被用作暴露给其他指令和控制器的一种API。我正在尝试使控制器和链接功能进行内部通信。 例如,我希望能够通过控制器函数设置一个变量,然后在链接函数中使用它: 如何在链接功能中访问myVar或sayHi?还是我完全错过了重点? 问题答案: 控制器的$ scope(在控制器中定义,而不在函数中定义)和链接都相同。可以从链接中使用在控

  • 问题内容: 在Vojta Jina的优秀存储库中,他在其中演示了指令的测试,他在模块包装器之外定义了指令控制器。看到这里:https : //github.com/vojtajina/ng- directive-testing/blob/master/js/tabs.js 这不是不好的做法并且会污染全局名称空间吗? 如果在另一个地方可以合理地调用TabsController,那会不会很麻烦? 可以