angularJS控制器函数回调

时间:2015-09-30 19:59:49

标签: javascript angularjs

我想知道回调如何在angularJS中起作用。 我有这个代码完全像这样

$scope.loginFB = function () {
  hello(FACEBOOK).login(function () {
    hello(FACEBOOK).api('me').then(function (profile) {
      console.log('successful api call');
      dbService.handle_credentials(profile);
      $rootScope.$apply(function () {
        $location.path('/homePage');
      });
    }, function(){
      console.error('something went wrong with authentification');
    });
  });
};

但在像这样重构时会以奇怪的方式工作

$scope.loginHandler =function () {
  hello(FACEBOOK).api('me').then(function (profile) {
    console.log('successful api call');
    dbService.handle_credentials(profile);
    $rootScope.$apply(function () {
      $location.path('/homePage');
    });
  }, function(){
    console.error('something went wrong with authentification');
  });
};

$scope.loginFB = function () {
  hello(FACEBOOK).login($scope.loginHandler());
};

请告诉我这次重构我做错了什么。

1 个答案:

答案 0 :(得分:3)

通过包含params,您将立即调用函数回调而不是传递函数 reference ,这是您真正想要做的事情。

$scope.loginFB = function () {
    hello(FACEBOOK).login($scope.loginHandler);
};

如果要将参数传递给回调函数,可以使用以下两种方法之一。

在匿名函数中包装回调

$scope.loginFB = function () {
    hello(FACEBOOK).login(function() { return $scope.loginHandler(param); });
};

在现代浏览器中,使用.bind()

$scope.loginFB = function () {
    hello(FACEBOOK).login($scope.loginHandler.bind(this, param)));
};