2016-03-29 2 views
0

Я прочитал в других ответах SO, что код, который не управляет представлением, должен быть доступен через services. Тем не менее, у меня есть функция, которую я хочу разделить на несколько угловых контроллеров, которые обращающийся как $scope, $rootScope и $location:AngularJS: Совместное использование функции между контроллерами

$scope.selectBatch = function (id) { 
     if (!id) { 
      $scope.batchSelected = false; 
      $rootScope.job = false; 
      $scope.data = allData; 
      $location.path('/', false); 
     } else { 
      $scope.batchSelected = id; 
      $rootScope.job = {'BatchId': id}; 
      var arr = []; 
      for (var i = 0; i < allData.length; i++) { 

       if (String(allData[i].BatchId) === String(id)) { 
        arr.push(allData[i]); 
       } 
      } 

      $scope.data = arr; 
      $rootScope.go(id, 'batch'); 
     } 
    }; 

В идеале, в каждом контроллере я хотел бы сделать что-то вроде:

$scope.selectBatch = services.selectBatch($scope, $rootscope, $location); 

, чтобы загрузить эту функцию из службы, хотя это ощущение «не угловатое».

Что такое «Угловой»/MVC способ ввода такого рода функций в несколько контроллеров?

+0

Как отличаются контроллеры? Можете ли вы просто повторно использовать один контроллер? – Phil

+0

Нет, контроллеры очень различаются с точки зрения данных, которые они вносят и как они обрабатываются.Однако есть одна или две функции, которые используются совместно всеми контроллерами. – Jascination

+0

Не имеет смысла модифицировать примитивы $ scope перед выполнением перенаправления. Никогда не нужно пропускать '$ scope' в службу/фабрику либо – charlietfl

ответ

0

От комментариев по этому вопросу он появляется правильный ответ, чтобы сделать это следующим образом:

1. Создать службу, которая возвращает функцию

angular.module('myApp.services', []).service('shared', ['$location', function ($location) { 

    this.selectBatch = function($rootScope, $scope){ 
     return function(id){ 
     // Do stuff with $location, id, $rootScope and $scope here 
     } 
    } 

}]); 

2. Внедрить услуги и связанные с ними функции в контроллеры

.controller('myCtrl', ['shared', '$scope', '$rootScope' 
    function (shared, $scope, $rootScope) { 

     $scope.selectBatch = shared.selectBatch($rootScope, $scope); 

}]); 

Вы можете затем вызовите эту функцию, используя $scope.selectBatch(id), и она работает должным образом.

С удовольствием рассмотрим другие ответы, если есть «лучшие» способы достижения этого.

+1

Зачем вводить '$ rootScope' в каждый контроллер, когда вы можете просто ввести его один раз в службу? – charlietfl

0

Угловые сервисы являются взаимозаменяемыми объектами, которые соединены вместе с использованием инъекции зависимостей (DI). Вы можете использовать службы для организации и совместного использования кода в своем приложении.

Вы можете использовать услуги по организации и совместного использования кода через приложение

Имейте в виду, что отправка $ объем в качестве параметра службы не является хорошей идеей. Вместо этого вы можете отправить параметры, необходимые функции для обработки чего-либо. Таким образом, ваше обслуживание может быть более многоразовым.

Проверить это SO Вопрос: Injecting $scope into an angular service function()

В идеале можно было бы написать общую службу, как это:

app.factory('sharedService', ['$location', function($location) 
{ 
    var sharedService = {}; 

    sharedService.selectBatch = function(batchSelected, job, data, id) 
    { 
     //Do something with batchSelected, job, data, id parameters 
    }; 

    return sharedService; 
}]); 

Тогда все контроллеры могли бы выглядеть следующим образом

app.controller('myCtrl', ['sharedService', function(sharedService) 
{ 

    $scope.batchSelected; 
    $scope.job; 
    $scope.data; 
    $scope.id; 

    $scope.selectBatch = sharedService.selectBatch($scope.batchSelected, $scope.job, $scope.data, $scope.id); 
}]); 

ПРИМЕЧАНИЕ

Вам также не нужно отправлять параметр $ location, так как вы можете вводить его в свою общую службу.

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