【问题标题】:Scope of a function inside an Angular JS ControllerAngular JS 控制器中函数的作用域
【发布时间】:2014-09-07 06:25:38
【问题描述】:

Angular js 控制器中定义的函数的作用域是什么?

.controller('MyCtrl', ['$scope', '$location', function($scope, $location) {

    function log() {
        console.log('Vanakkam Ulagam');
    }

    var functionToCall = 'log';

    ????????[functionToCall]();

}])

我尝试了 MyCtrl、this 和 $window。我可以通过像functions.print = function() 这样命名空间然后使用functions[functionToCall]() 来访问该函数。

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

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    我认为这是这个问题的解决方案

    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>
    

    【讨论】:

      【解决方案2】:

      如果您只是想在控制器代码中访问全局函数,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(您说您尝试过但没有成功...您确定注入正确吗?仔细查看文档中的示例)。但就像我说的,如果你将全局对象附加到你打开潘多拉魔盒的范围内。

      【讨论】:

      • 您好,谢谢您的回答。我了解如何访问全局变量、范围变量。我想知道的是控制器内部定义的函数属于什么范围?我想知道什么可以代替 ?s 并使其工作。
      • 在控制器内部它只是 javascript。你可以只使用窗口。控制器内定义的函数不属于角度范围,除非您明确添加它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2015-09-18
      • 2016-03-11
      • 2014-10-23
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      相关资源
      最近更新 更多