0

Я работаю с проектом. Я использую pagination, checkAll, deleteAll, как функции, которые являются общими для всех контроллеров. Я хочу переместить код на завод или услугу, поэтому его можно использовать для всех контроллеров. Я старался, но не ясно, с совершенством. Я хочу намекнуть. Я знаю, чтобы создать фабрику или сервис, и как проинформировать его о контроллере, но немного путать с логикой перемещения аналогичного кода.Объединение общей функции в контроллерах AngularJS

Я приводил пример, который я использую для записи во всем контроллере, Logic for Sorting и pagination.

$scope.bigCurrentPage = 1; 
$scope.editIndex = ""; 

var sortKey = "name"; 
var sortDirection = "ASC"; 
$scope.filterObj = {order: [sortKey + " " + sortDirection], limit: CONFIG.limit, offset: 0}; 
$scope.filterObj.offset = ($scope.bigCurrentPage - 1) * CONFIG.limit; 

$scope.sortList = function (inputSort) { 
    if (sortKey === inputSort) { 
     sortDirection = (sortDirection === "ASC") ? "DESC" : "ASC"; 
    } else { 
     sortKey = inputSort; 
    } 
    $scope.filterObj.order = [sortKey + " " + sortDirection]; 
    $scope.pageChanged(); 
} 


$scope.getSongs = function() { 
    $scope.filterObj.offset = ($scope.bigCurrentPage - 1) * CONFIG.limit; 
    Song.find({filter: $scope.filterObj}) 
      .$promise 
      .then(function (data) { 
       $scope.items = data; 
       $scope.maxSize = 5; 
       $scope.size = $scope.filterObj.limit; 
       $scope.countingIndex = ($scope.bigCurrentPage - 1) * $scope.filterObj.limit; //Its idea to implement counting. Variable is not part of pagination..////  
      }); 
}; 


$scope.pageChanged = function() { 
    $scope.getSongs(); 
}; 

$scope.pageChanged(); 

Таким образом, предположим, что я делаю это для альбомов и я хотел бы изменить SortKey как «ид», будет использовать услуги с «Album.find», изменит объект «фильтр», и я сделал, но факт Я использую общий код во всех контроллерах. Как бы я написал это лучше.

+1

Поскольку вы используете кучу $ scope, тогда услуги не подходят. Сделайте себе базовый класс контроллера и наследуйте его. – Cerad

ответ

3

У вас есть много свойств, которые очень сложно поддерживать в обслуживании, поэтому я предлагаю вам использовать контроллер, а не службу, (или переместите переменную многократного использования в службу, которая сделает больше смысла кода). Ниже создан контроллер, который может быть инжектирован в любой другой контроллер, используя зависимость $controller.

Common Controller

app.controller('commonCtrl', function($scope) { 
    $scope.bigCurrentPage = 1; 
    $scope.editIndex = ""; 

    var sortKey = "name"; 
    var sortDirection = "ASC"; 
    $scope.filterObj = { 
     order: [sortKey + " " + sortDirection], 
     limit: CONFIG.limit, 
     offset: 0 
    }; 
    $scope.filterObj.offset = ($scope.bigCurrentPage - 1) * CONFIG.limit; 

    $scope.sortList = function(inputSort) { 
     if (sortKey === inputSort) { 
      sortDirection = (sortDirection === "ASC") ? "DESC" : "ASC"; 
     } else { 
      sortKey = inputSort; 
     } 
     $scope.filterObj.order = [sortKey + " " + sortDirection]; 
     $scope.pageChanged(); 
    } 

    $scope.getSongs = function() { 
     $scope.filterObj.offset = ($scope.bigCurrentPage - 1) * CONFIG.limit; 
     Song.find({ 
       filter: $scope.filterObj 
      }) 
      .$promise 
      .then(function(data) { 
       $scope.items = data; 
       $scope.maxSize = 5; 
       $scope.size = $scope.filterObj.limit; 
       $scope.countingIndex = ($scope.bigCurrentPage - 1) * $scope.filterObj.limit; //Its idea to implement counting. Variable is not part of pagination..////  
      }); 
    }; 

    $scope.pageChanged = function() { 
     $scope.getSongs(); 
    }; 

    $scope.pageChanged(); 
}); 

Вы могли бы привнести это создало commonCtrl для любого другого контроллера, используя зависимость $ контроллера, commonCtrl акций его возможности для контроллера, где он получает впрыскивается. Но изменения, сделанные от controllerA в commonCtrl, будут недоступны в controllerB, потому что commonCtrl предоставил копию своего объема контроллеру, который его вводит.

контроллер

app.controller('controllerA', function($scope, $controller){ 
    $controller('commonCtrl', {$scope: $scope}); //inject commonCtrl scope to current scope 
    //common scope will be available from here 
}) 

ПРИМЕЧАНИЕ

Если вы хотите изменения, которые будут отражены в другом контроллере можно использовать службы с этим контроллером, который бы разделяет общие свойства различные контроллеры.

+0

Можете ли вы, пожалуйста, пояснить бит в ControllerA. Было бы проще. Как мне передать зависимость от controllerA к commonCtrl. Поскольку я использую то же самое с различным набором сервисов. Еще один вопрос будет работать, если я буду использовать контроллеры на той же странице, что и ControllerA и ControllerB – Sankalp

+0

Будет ли он работать отдельно для обоих контроллеров A и B ?? – Sankalp

+0

Нет, он просто даст 'commonCtrl' копию' controlA' изменений в 'commonCtrl' из' controllerA' не будет доступен в 'controllerB', я добавлю больше информации. .. Вы хотите, чтобы изменения были сделаны с' controllerA' должен быть доступен в 'controllerB' –

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