2014-07-10 2 views
4

angularJS 서비스와 관련하여 질문이 있습니다.angularJS 서비스 - 데이터 검색을위한 약속 반환 및 데이터 관리를위한 객체?

내가 읽은 것부터 서비스를 사용하는 두 가지 방법이 있습니다.

[1] 서비스가 데이터를 반환하겠다는 약속을 반환하도록하십시오. routeProvider에서이 메서드를 사용하면 Angular가 페이지를로드하기 전에 데이터를 반환하겠다는 약속을 확인합니다.

App.factory('BooksService', function($q, $http) { 
    var deferred = $q.defer(); 
    $http.get('/rest/books').then(function(data) { 
    deferred.resolve(data); 
    }, function(err) { 
    deferred.reject(data); 
    }); 
    return deferred.promise; 
}; 

그런 다음 내 경로 제공에 :

... 
    $routeProvider.when('/books', { 
    controller : 'BooksCtrl', 
    templateUrl: '/partials/books.html', 
    resolve: { 
     books: 'BooksService' 
    } 
    }); 
... 

그런 다음 내 컨트롤러 :

App.controller('AddPaypalAccountCtrl', function($scope, BooksService) { 
    $scope.books = BooksService; 
} 

[2] 서비스가 기능 및 데이터를 포함하는 객체를 반환하게한다.

App.factory('BooksService', function($q, $http) { 
    var books = []; 
    var service = { 
     getBooks : function() { 
     return books; 
     }, 
     addBook: function(book) { 
     books.push(book); 
     } 
    }; 
    return service; 
}; 

내 질문 : 그것은 두 세계의 최고를 얻을 서비스가 결의는 기능 및 데이터를 포함하는 객체를 반환 할 때 그 약속을 반환해야 할 수 있습니까?

'/ books'페이지를로드하기 전에 $ http 호출을 통해 해결할 책을 얻을 수 있지만 해당 책을 관리 할 수있는 서비스에 액세스하고 싶습니다. 물론 두 가지 서비스를 작성할 수 있지만 두 서비스를 동일하게 유지하고 두 개의 새를 죽이는 서비스를 작성하는 것이 더 효율적인지 궁금합니다.

다음은 리턴하는 공장의 예입니다 도서 검색에 대한 약속. 나는/책 페이지로 이동하기 전에 책을 검색 할 것을 요구, 다음과 같이

App.factory('BooksService', function($q, $http) { 
    var books = []; 
    var service = { 
    getBooks: function() { 
     return books; 
    }, 
    addBook: function(book) { 
     books.push(book); 
    } 
    } 
    var deferred = $q.defer(); 
    $http.get('/books').then(function(data) { 
    books = data.data; 
    deferred.resolve(service); 
    , function(err){ 
    deferred.reject(err); 
    }); 
    return service; 
}; 

그런 다음, 이전에 따라, 내 경로 제공 업체는 다음과 같습니다 내 컨트롤러에

... 
    $routeProvider.when('/books', { 
    controller : 'BooksCtrl', 
    templateUrl: '/partials/books.html', 
    resolve: { 
     books: 'BooksService' 
    } 
    }); 
... 

그럼, 부착합니다 그렇게 범위에 책을.

App.controller('AddPaypalAccountCtrl', function($scope, BooksService) { 
    $scope.books = BooksService.getBooks(); 
} 

나는 아직 아무도 보지 못했고, 이것이 괜찮은지 궁금합니다.

답변

0

SRP - Single Responsibility Principle을 위반하려고 생각합니다.

서비스의 책임은 무엇입니까? 비동기 요청을위한 API를 제공하거나 요청을 하시겠습니까? API를 제공하는 경우 비동기로로드하면 안됩니다. 너무 요청을하면 서비스 자체가 아니라 서비스의 방법이어야합니다. 서비스가 요청이 아닌 인터페이스입니다!

드물게 당신은 다시 서버에서 논리를받을 필요가 없을 수도 있지만, 다시, 당신은 문제를 분리해야합니다 :

  • 서버에서 논리 (문자열로, 예를 들어 각도 표현)를 가져옵니다.

  • 로직을 수행하는 함수로 구문 분석합니다 (각도 $parse 서비스로 수행 할 수 있음).

  • 당신이 그것을 사용해야 할 때마다 논리 기능을 주입하십시오.

관련 문제