【发布时间】:2017-08-21 09:37:30
【问题描述】:
我有一个 AngularJS 应用程序,在其中一个页面上,我有许多小部件,每个小部件都显示有关系统一部分状态的一些信息。 我目前正在添加功能以允许用户“隐藏”给定小部件的标题。
在显示小部件的页面上有一个“设置”按钮,单击该按钮时,会在每个小部件顶部覆盖一个工具栏。工具栏有许多按钮 - 其中一个是另一个“设置”按钮,它会打开一个对话框,允许用户更改该特定小部件的设置。
我在对话框中添加了一个复选框,以使用户能够从视图中“隐藏”该特定小部件的标题:
在对话框中选择复选框时,用户点击“预览”,我期待(最终 - 我仍然正在研究该功能的实现)标题为该特定窗口小部件被隐藏。但是,目前,当用户单击“预览”时,无论复选框是否被选中,我都会在控制台中收到一条错误消息:
TypeError: $scope.widget.toggleWidgetHeading 不是函数
此错误来自 ctrl.js 中的 $scope.preview 函数,当单击对话框上的“预览”按钮时调用:
}).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 中定义的)?
【问题讨论】:
-
什么是
$scope.widget,它与appWidget指令有何关系?以您所做的方式在指令中定义函数并不能保证它以某种方式附加到$scope.widget对象。
标签: javascript angularjs widget function-call function-definition