【问题标题】:Detect that a function was called from ngclick in angularjs检测从angularjs中的ngclick调用了一个函数
【发布时间】:2014-06-14 09:25:18
【问题描述】:

假设我在按钮上有一个 ng-click 事件

<button ng-click="callMe()" />

在我的 AngularJS 控制器中,我有类似的东西

myApp.controller('myController', ['$scope', function ($scope)] {
    $scope.callMe = function() {
        console.log("call originated from...");
    };

    $scope.anotherMethod = function(){
        $scope.callMe();
    }
});

我可以从 callMe 方法内部判断它是从哪里调用的吗?即用户是在单击按钮时触发它还是来自另一个方法方法?

理想情况下,我不想在函数调用中传递其他变量。 例如

callMe('fromClick')

谢谢

【问题讨论】:

  • 你可以使用arguments.callee.caller,但它已被官方弃用,并且在严格模式下不起作用:jsfiddle.net/P24dY/1

标签: javascript angularjs


【解决方案1】:

如果你必须执行不同的任务,当函数被点击或其他东西触发时,我的建议是使用不同的函数,并且只对实际上相同的任务使用相同的函数:

HTML

<button ng-click="onClick()" />

JavaScript

myApp.controller('myController', ['$scope', function ($scope)] {

    $scope.onClick = function () {
        //do click related tasks 

        callMe();
    };

    $scope.anotherMethod = function(){
        //do other tasks

        callMe();
    };

    function callMe() {
        //do stuff that has to be done in both cases
    }
});

【讨论】:

    【解决方案2】:

    你可以这样做:

    <button ng-click="callMe($event)" />
    
    $scope.callMe = function($event) {
        console.log("call originated from..." + $event.target);
    };
    

    但这违背了 AngularJS 的哲学(破坏了视图和控制器之间的分离)。查看Accessing clicked element in angularjs 以获得更完整的答案以及替代解决方案。

    【讨论】:

      【解决方案3】:

      我所做的是使用$broadcast

      https://docs.angularjs.org/api/ng/type/$rootScope.Scope

      这是一个使用示例:

      您需要将$rootScope 传递给您的控制器

      myApp.controller('myController', ['$scope, $rootScope', function ($scope, $rootScope)] {
      

      然后在你的$scope.callMe():

      $scope.callMe = function() {
        console.log("call originated from...");
        $rootScope.$broadcast('callThis')
      };
      

      最后在你的$scope.anotherMethod():

      $scope.isCallThis = false
      
      $scope.anotherMethod = function () {
        if (!$scope.isCallThis) {
          $scope.$on('callThis', function () {
            // Do stuff here
          })
      
          $scope.isCallThis = true
        }
      }
      

      我使用$scope.isCallThis = false 来确保您只设置$scope.$on() 一次。

      我希望这会有所帮助,我通常在创建指令并且需要触发代码块时使用它。

      【讨论】:

      • 每次调用anotherMethod 函数时,您都会添加一个新的事件处理程序。
      • 哦,对了。我忘了我是否在控制器中使用它,我通常在它周围放置一个布尔检查,所以它只运行一次。
      猜你喜欢
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      相关资源
      最近更新 更多