我有一个 AngularJS 应用程序,在其中一个页面上,我有许多小部件,每个小部件都显示有关系统一部分状态的一些信息。我目前正在添加功能以允许用户“隐藏”给定小部件的标题。
在显示小部件的页面上有一个“设置”按钮,单击该按钮时,会在每个小部件顶部覆盖一个工具栏。工具栏有许多按钮——其中一个是另一个“设置”按钮,它打开一个对话框,允许用户更改该特定小部件的设置。
我在对话框中添加了一个复选框,以使用户能够从视图中“隐藏”该特定小部件的标题:
当在对话框中选中复选框并且用户单击“预览”时,我期望(最终 - 我仍在努力实现该功能)隐藏该特定小部件的标题。但是,目前,当用户单击“预览”时,无论是否选中该复选框,我都会在控制台中收到一条错误消息:
类型错误:$scope.widget.toggleWidgetHeading 不是函数
此错误来自$scope.preview
在对话框中单击“预览”按钮时调用的 ctrl.js 中的函数:
}).controller('WidgetPickerCtrl', function($scope, $timeout, fxTag, gPresets, appWidget) {
...
$scope.preview = function(e) {
$scope.widget.toggleWidgetHeading();
...
};
...
});
我不明白为什么我会收到这个控制台错误,因为toggleWidgetHeading()
显然是一个函数......
如果我在 Sublime 中右键单击上面的函数调用,然后选择“转到定义”,我将被带到定义函数的 directive.js 文件:
.directive('appWidget', function($timeout, fxTag, appColorFilter) {
return {
...
link: function($scope, $element){
...
var toggleWidgetHeading = function(){
...
}
...
}
}
})
此外,单击对话框上的“预览”按钮不再关闭对话框...
为什么当它被明确定义为一个函数时,我被告知这个函数调用不是一个函数?这里的问题是否与范围有关(即我从 ctrl.js 调用该函数,即使它是在directive.js 中定义的)?