2015-04-05 36 views
0

我试着写工厂方法在角JS:如何从Factory Angular JS访问全局变量?

.factory('FriendsFactory', function(){ 

      var friend = {}; 

      friend.delete = function(id) { 
       notificationsModal.show('danger', messages_info[86]); 
       notificationsModal.confirm(function() { 
        this.deleteAjax(event, id, type); 
       }) 
      } 

      friend.deleteAjax = function (event, id, type){ 
       var target = angular.element(event.target); 
       var request = $http({ 
        method: "POST", 
        url: "/subscribe/deletesubscriber", 
        data: $.param({ id : id, type : type }), 
        headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
       }); 

       request.success(function() { 
        target.closest('.notif-item').remove(); 
        $scope.counter--; 
       }); 

       request.error(function() { 
        // TODO 
       }); 
      } 

      return friend; 
     }) 

此代码有两种方法:friend.delete()friend.deleteAjax()

调用函数从厂:

.controller('FriendsController', ['$scope','$http', 'friendsFactory', function($scope, $http) { 
    $scope.deleteUser = function (idUser) { 
     friendsFactory.delete(idUser); 
    } 

}]) 

我需要递减变量$scope.counterfriend.deleteAjax() ajax响应,无论从控制器被称为工厂。 我可以在每个控制器做重复:

$scope.counter = 10;和呼叫后出厂,但它不是好

回答

2

尽管@JBNizet提出的答案是绝对正确的,但是如果你必须以这种方式使用代码,那么你可以做两件事。首先是简单地从控制器向服务调用传递$范围(这是不是不推荐使用更简洁的方法):

$scope.deleteUser = function (idUser) { 
    friendsFactory.delete(idUser, $scope); 
} 

你也可以使用在工厂内的范围。
第二种选择是使用当前控制器的作用域作为根作用域,然后在工厂中使用它。

在你的控制器

$scope.deleteUser = function (idUser) { 
    $rootScope.callingControllerScope = $scope; 
    friendsFactory.delete(idUser); 
} 

在你的工厂

friend.deleteAjax = function (event, id, type){ 
    console.log($rootScope.callingControllerScope.counter); 
    // your code 
} 

而且你还需要修复您的依赖注入:

.controller('FriendsController', ['$scope','$http', 'FriendsFactory', function($scope, $http, friendsFactory) { 
    $scope.deleteUser = function (idUser) { 
     friendsFactory.delete(idUser, $scope); 
    } 
}]); 
+0

感谢。我试过:'.controller('FriendsController',['$ scope','$ http','friendsFactory',函数($ scope,$ http,$ friendsFactory){ $ scope.deleteUser = function(idUser){ friendsFactory.delete(idUser,$ scope); }}])'并得到错误:'错误:[$ injector:unpr] FriendsController' – Sahe 2015-04-05 10:04:41

+0

您正在注入错误大小写的'FriendsFactory'。将它改为:'.controller('FriendsController',['$ scope','$ http','FriendsFactory',function($ scope,$ http,friendsFactory){$ scope.deleteUser = function(idUser){friendsFactory。删除(idUser,$ scope);}}])' – 2015-04-05 10:43:43

+0

我也修改了固定依赖注入的答案。工厂或任何服务的名称需要与工厂名称中定义的名称完全相同。所以你已经定义了'friendsFactory'而不是'FriendsFactory'(camel case)。 – 2015-04-05 10:46:46

2

你做错了很多很多的事情:

使用friendsFactory而不是FriendsFactory

.controller('FriendsController', ['$scope','$http', 'friendsFactory' 
             here --------^ 

忘记声明friendsFactory作为控制器功能的参数:

.controller('FriendsController', ['$scope','$http', 'friendsFactory', function($scope, $http) { 
                        here ----^ 

在服务访问未定义$scope变量:

$scope.counter--; 
^--- here 

的服务做的DOM操作...

服务责任不操纵DOM和控制范围。

应该使用html模板中的指令修改DOM。

控制器范围应该由控制器管理,而不是由服务管理。从deleteAjax()函数返回承诺request,并让控制器注册成功回调,而不是在服务中进行。这个回调将能够访问控制器范围。

请注意,大部分错误都是基本的JavaScript错误,应由好的JavaScript编辑器发出信号,或者至少通过查看浏览器控制台中的错误。