2015-02-19 3 views
0

Я прочитал много статей, но до сих пор не смог найти, как вкладывать вещи в сервисы.Какие вещи я могу использовать в угловых Js

В настоящее время это моя служба

angular 
    .module('users') 
    .factory('objectiveService', objectiveService); 

objectiveService.$inject = ['$http', 'Restangular']; 

function objectiveService($http, Restangular) { 
    return { 
    getObjectives: getObjectives, 
    getSingleObjective: getSingleObjective 
    }; 

    function getObjectives(pid) { 
    var pr = Restangular 
     .all('api') 
     .all('users') 
     .one('subjects', pid) 
     .all('objectives'); 

    return pr; 
    } 

    function getSingleObjective(oid) { 
    var pr = Restangular 
     .all('api') 
     .all('users') 
     .one('objectives', oid); 

    return pr 

    } 
} 

Это контроллер:

var _vm = this; 
this.objPromise = objectiveService.getObjectives(44); 

function getData() { 
    var promise = _vm.objPromise; 

    promise 
    .getList(filters) 
    .then(function(result) { 
     $scope.gridData = result; 
    }); 
} 

function remove(id) { 
    if (confirm('Are you sure you want to delete this!')) { 
    objectiveService.getSingleObjective(id).remove().then(function() { 
     $scope.getData(); 
    }); 

    } 
} 

// initial call 
$scope.getData(); 

В этом коде я в основном вижу смысла нет, чтобы определить службу, потому что я до сих пор использовать then() в контроллере назначить данные Grid.

Также я не могу использовать then() в службе, потому что у меня нет $ scope для обновления данных.

Люди говорят, что делают все на службе, но я не могу понять, как это сделать.

В идеале я хочу поставить все функции, такие как remove(object_id) в обслуживании

IS возможно, что я могу просто сделать objectiveService.remove(id) в контроллере.

Но тогда я должен позвонить $scope.getData() после удаления которой я не могу сделать в службе

+3

В чем проблема с вызовом '.then' в контроллере? Это нормально. Контроллер явно имеет дело с просто назначением данных в ViewModel (внутри '. Then', в данном случае), и служба имеет дело с бэкэнд. Четкое разделение проблем –

+0

@NewDev. Тогда проблема связана с функцией ошибки. Потому что я всегда показываю erros в верхней части, и код такой же. но я должен повторить это во всех функциях 'then()'.Есть ли способ, которым мои апромиты используют ту же самую функцию ошибки – user3214546

+0

, создайте единую функцию, скажем 'errorHandler', и просто передайте ссылку на нее:' getObjectives(). Catch (errorHandler) ' –

ответ

1

Причины пользоваться услугами не избежать использования .then. В контроллере вы будете использовать .then так:

objectiveService.getObjectives(filters) 
    .then(function(result) { 
     $scope.gridData = result; 
    }); 

.then требуется как вызов для получения данных происходит асинхронно.

Некоторые причины взяты из John Papa's style guide:

  • ответственность контроллера является для представления и сбора информации для зрения. Его не должно волновать, как он получает данные, просто он знает, кто его попросит.

  • Это облегчает проверку (издевку или реальность) вызовов данных при тестировании контроллера, использующего службу передачи данных.

  • Реализация данных может иметь очень специфический код для обработки репозитория данных. Это может включать заголовки, как разговаривать с данными или другие службы, такие как $ http. Разделение логики на службу данных инкапсулирует эту логику в единственном месте, скрывая реализацию от внешних потребителей (возможно, контроллера), а также упрощает изменение реализации.

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

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