javascript - 当指令似乎没有使用 Controller 函数中的依赖项时,删除它们是否安全?

标签 javascript angularjs angularjs-directive

以下 Controller 似乎没有使用$element、$attrs、$transclude。如果这些参数被注释掉,下面的 Controller 代码可以正常运行。

myApp.directive("menu", function () {
    return {
        restrict: "E",
        scope: {},
        transclude: true,
        replace: true,
        template: "<div class='menu' data-ng-transclude></div>",
        controller: function ($scope ,$element, $attrs, $transclude) {
            $scope.submenus = [];
            console.log('[$element]->', $element);
            console.log('[$attrs]->', $attrs);
            console.log('[$transclude]->', $transclude);
            this.addSubmenu = function (submenu) {
                console.log('[addToggleMenu]->');
               $scope.submenus.push(submenu);
            }

            this.closeAllOtherPanes = function (displayedPane) {
                angular.forEach($scope.submenus, function (submenu) {
                    if (submenu != displayedPane) {
                        console.log('[displayedPane]->', displayedPane);
                        submenu.removeDisplayClass();
                    }
                })
            }
        }
    }
});

这里是my working fiddle .

自从发帖以来,我了解到在 JavaScript 中,可以使用任意数量的参数调用函数,无论列出了多少个参数。在某些语言中,程序员可能会编写两个名称相同但参数列表不同的函数,解释器/编译器会选择正确的函数。这就是所谓的函数多态性。在我职业生涯的大部分时间里都在使用函数多态性,我期望被告知“嘿,你没有使用这个参数”。另外,我不太明白 Controller 参数是依赖项,而链接函数参数是基于顺序的。我仍然很难理解指令内部 Controller 中的 $scope、$element 或常用参数是否是必需的以及哪些是可选的。显然 $ 仅在 Controller 中需要,而不是在链接中,因为 Angular 服务的 DI 注入(inject)..需要消化很多。

特别感谢 Esteban 解释每个函数内的特殊伪数组 称为参数。这解释了链接函数,它是方程的一半。所以我重写了这个问题,希望能得到答案。 This excellent explanation , 解决了我大部分的困惑。

最佳答案

为什么要删除 $attrs 参数?该指令的参数按特定顺序排列,删除其中任何一个都会导致后续参数不是您所认为的那样。

假设您将链接功能更改为如下所示:

function ($scope, $iElement, menuController) {
        menuController.addSubmenu($scope); // this will throw  an exception 
                                           // because menuController is actually
                                           // $attrs

这样做的原因是,无论是否在指令的链接函数中定义了这些参数,都会使用传入的相同参数来调用该函数。

function argTest(one, two){
    console.log('argTest.arguments', arguments);
    // even though I don't have three defined, it is still passed in:
    console.log('three is passed in', arguments[2]);
}
argTest(1,2,3);

上面的 JSFiddle:http://jsfiddle.net/TwoToneBytes/NM8DK/

关于javascript - 当指令似乎没有使用 Controller 函数中的依赖项时,删除它们是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22202311/

相关文章:

javascript - 如何将值从 JSON API 放入 Angular 模板指令

javascript - 焦点问题使测试失败

javascript - 在 Angular 中刷新指令

AngularJS : ng-repeat's compile and link functions

javascript - 纯 javascript 在 iPad 上拖动不流畅

javascript - 关于一段代码

jquery - 可以使用 AngularUI jQuery PassThrough 作为 WayPoints 插件吗?

javascript - 如何使用 st-table 根据日期时间对数据进行排序

javascript - 为什么该 JS 文件在 Firebug 的 net 选项卡下加载两次?

javascript - 帧源变化检测