Angular JS Controller中函数的范围

时间:2014-09-07 06:25:39

标签: javascript angularjs

在角度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]()

我更感兴趣的是在没有命名空间的情况下访问该函数。可能吗?如果没有,为什么?

2 个答案:

答案 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。