在角度js控制器中定义的函数是什么范围的?
.controller('MyCtrl', ['$scope', '$location', function($scope, $location) {
function log() {
console.log('Vanakkam Ulagam');
}
var functionToCall = 'log';
????????[functionToCall]();
}])
我尝试了MyCtrl,这和$ window。我可以通过命名空间来访问该函数,就像functions.print = function()
一样,然后使用functions[functionToCall]()
。
我更感兴趣的是在没有命名空间的情况下访问该函数。可能吗?如果没有,为什么?
答案 0 :(得分:0)
我认为这是这个问题的解决方案
var f;
var a = angular.module('MyApp',[]);
a.controller('MyCtrl', ['$scope', function ($scope) {
$scope.log=function(){
console.log('test');
}
f=$scope.log;
});
并且此函数可用于元素html,例如
<button ng-click='log()'></button>
or
<button onclick='f()'></button>
答案 1 :(得分:0)
如果您只是尝试访问控制器代码中的全局函数,window
(或$window
如果正确注入)应该可以正常工作:
$scope.alert = function(text) { window.alert(text) }
为了更加确定这适用于其他环境,您可以在自动调用的匿名函数中手动绑定它:
(function(global){ //make the global scope assigned to the variable global
app.controller('MyCtrl',['$scope',function($scope){
$scope.alert = global.alert;
}]);
)(this); //this is the global object when this is evaluated
如果你想在DOM元素(例如ng-click
)的表达式中做任何事情,重要的是要意识到角度表达式是由Angular自己的表达式求值程序(即通过$scope.$eval)计算的。因此,如果某些内容未附加到作用域,则不能在角度表达式中使用它。
但是,如果你要做一些事情,比如将全局对象附加到范围,那么一切都是公平的游戏。这不是真的不推荐(我认为没有真正的理由这样做,并且最好手动定义你需要的功能),但是:
$scope.global = window
您的控制器定义内部应该有效。然后,您可以在DOM中执行ng-click="global.alert('Yo SO!')"
之类的操作而不会出现问题。
为了更好的可测试性,你可以使用$window(你说你试过它并且它不起作用......你确定你正确地注入了吗?仔细查看文档中的示例)。但就像我说的那样,如果您将全局对象附加到范围,那么您将打开Pandora's Box。