【发布时间】:2014-03-09 10:06:22
【问题描述】:
下面的控制器似乎没有使用$element、$attrs、$transclude。如果这些参数被注释掉,下面的控制器代码运行良好。
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();
}
})
}
}
}
});
自从发帖以来,我了解到在 JavaScript 中,无论列出多少参数,都可以使用任意数量的参数调用函数。在某些语言中,程序员可能会编写两个具有相同名称但参数列表不同的函数,解释器/编译器会选择正确的一个。这就是所谓的函数多态性。在我职业生涯的大部分时间里都使用了函数多态性,我预计会被告知“嘿,你没有使用这个参数”。我也不太明白控制器参数是依赖关系,而链接函数参数是基于顺序的。我仍然难以理解指令内部控制器中的 $scope、$element 或常用参数是否是必需的,哪些是可选的。显然,$ 仅在控制器中需要,而不是在链接中,因为角度服务的 DI 注入......需要大量消化。
特别感谢 Esteban 解释了每个函数内部的特殊伪数组 称为论据。这解释了方程的一半的链接函数。所以我重写了这个问题,希望它可以得到回答。 This excellent explanation, 解决了我的大部分困惑。
【问题讨论】:
标签: javascript angularjs angularjs-directive