如何从Factory Angularjs访问全局变量?

时间:2015-04-05 09:04:01

标签: angularjs

我尝试在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.counter ajax响应中递减变量friend.deleteAjax(),无论控制器来自工厂。 我可以在每个控制器中复制:

$scope.counter = 10;并且在致电工厂之后,但它并不好

2 个答案:

答案 0 :(得分: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。

控制器范围应由控制器管理,而不是由服务管理。从request函数返回promise deleteAjax(),让控制器注册成功回调,而不是在服务中执行。然后,此回调将能够访问控制器范围。

请注意,大多数错误都是基本的JavaScript错误,应该由优秀的JavaScript编辑器发出信号,或至少通过查看浏览器控制台中的错误来发出错误。

答案 1 :(得分:2)

尽管@JBNizet提出的答案是绝对正确的,但如果您必须按原样使用代码,那么您可以做两件事。首先是简单地将$ scope从控制器传递给服务调用(不建议使用更简洁的方法):

$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);
    }
 }]);