以下 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/