2015-04-05 2 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.counter в friend.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', function ($ scope, $ http, $ friendsFactory) { $ scope.deleteUser = function (idUser) { friendsFactory.delete (idUser, $ scope); }}]) 'и получил ошибку:' Ошибка: [$ injector: unpr] FriendsController' – Sahe

+0

Вы вводите 'FriendsFactory' неверный случай. Измените его как: '.controller ('FriendsController', ['$ scope', '$ http', 'FriendsFactory', function ($ scope, $ http, friendsFactory) {$ scope.deleteUser = function (idUser) {friendsFactory. delete (idUser, $ scope);}}]) ' –

+0

Я также изменил ответ с помощью фиксированной инъекции зависимостей. Название фабрики или любого сервиса должно быть точно таким же, как указано в заводском наименовании. Таким образом, вы определили 'friendsFactory' вместо' FriendsFactory' (случай верблюда). –

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 и область видимости контроллера.

DOM следует изменить с помощью директив в шаблоне html.

Объем контроллера должен управляться контроллером, а не службой. Верните обещание request из функции deleteAjax(), и пусть контроллер зарегистрирует успешный обратный вызов, а не выполняет его в сервисе. Затем этот обратный вызов сможет получить доступ к области контроллера.

Обратите внимание, что большинство ошибок - это базовая ошибка JavaScript, о которой должен сигнализировать хороший редактор JavaScript или, по крайней мере, поиск ошибок в консоли вашего браузера.

Смежные вопросы