将函数作为参数发送

时间:2015-09-02 19:20:09

标签: javascript angularjs

我有一个我想作为参数发出的函数。

我尝试了以下内容:

$scope.$watchGroup(['watch1', 'watch2'], function(newValues, oldValues, scope) {
    if (scope.1 && scope.2) {
        $scope.$emit('enableButton', {$scope.submit(true)});
    }
});

其中$ scope.submit(true)是我在当前控制器中定义的函数。

然后在我的另一个控制器中:

$scope.$on('enableButton', function(event, data) {
  $scope.buttonAction = data;
});

当我尝试为$ scope.buttonAction分配作为参数传递的函数时,该函数只在$ emit发生时自动触发。为什么会这样?

1 个答案:

答案 0 :(得分:2)

因为您正在使用参数和参数传递函数调用,所以在您尝试在事件中传递函数时,将执行函数调用。您应该将引用传递给函数。

$scope.$emit('enableButton', $scope.submit);

如果需要保留参数,可以将函数调用包装在匿名函数中并传递该函数。这与通过引用传递不同,通常用于回调参数:

$scope.$emit('enableButton', function() { return $scope.submit(true); });

这里需要注意的是,如果在调用$scope.buttonAction之前使用变量来表示true并且变量发生变化,则传递的值也会发生变化。

您可以使用.bind()保留变量的上下文,在现代浏览器中解决此问题。

$scope.$emit('enableButton', $scope.submit.bind(this, isSubmittable));