2012-06-28 10 views
8

Zamiast publikować w Angular na liście dyskusyjnej, myślę, że to może być bardziej pytanie javascript. Mam nadzieję, że społeczność SO może również dać szybszą odpowiedź.AngularJS - tworzenie obiektu usługi

Próbuję enkapsulować dane w usłudze i wstrzykiwać do kontrolera.

angular.module('myApp.services', ['ngResource']). 
    factory('Player', function($resource){ 
     var Player ; 
     Player = { 
      resource: $resource('/api/Player/:_id', {}) 
     }; 
     return Player 
}); 


function PlayerDetailCtrl(Player, $routeParams, $scope) { 
    $scope.resource = Player.resource.get({_id:$routeParams._id}); 
} 
PlayerDetailCtrl.$inject = ['Player', '$routeParams', '$scope']; 

zgłasza wyjątek

TypeError: Object #<Object> has no method 'query' 

$scope.resource = Player.Player.resource.get({_id:$routeParams._id}); rzuca również error

TypeError: Object #<Object> has no method 'query' 

poniższych prac.

angular.module('myApp.services', ['ngResource']). 
    factory('Player', function($resource){ 
     var Player ; 
     Player= $resource('/api/Player/:_id', {}) 
     return Player 
}); 


function PlayerDetailCtrl(Player, $routeParams, $scope) { 
    $scope.resource = Player.Player.get({_id:$routeParams._id}); 
} 
PlayerDetailCtrl.$inject = ['Player', '$routeParams', '$scope']; 

moim zamiarem jest dodanie większej ilości danych i metody Player. Więc jak mogę zrobić pierwszą (obiektową) działa!

+0

Interesujące. Czy 'Player: $ resource ('/ api/Player /: _ id', {})' poprawny javascript? –

+0

Niezwykle mi przykro, redagował tymczasem. działa, jeśli przypiszę do zmiennej i uzyskuję do niej dostęp, ale nie, jeśli jest ona przypisana do obiektu. dzięki – bsr

+0

@GraceShao 'Player: $ resource ('/ api/Player /: _ id', {})' tak, jeśli jest częścią definicji członka ... – jcolebrand

Odpowiedz

6

Tworzycie fabrykę, jest to nietypowy sposób robienia. Nie chcesz zwracać instancji. Angular da ci instancję w twoim kontrolerze.

factory('Player', function ($resource) { 
    return $resource('/api/Player/:_id', { }); 
}) 

Oto serwis pisałem do interakcji z usługą CakePHP REST. Napisałem go jakiś czas temu, więc po prostu weź to jako ilustrację, mogę to zmienić.

factory('CommentSvc', function ($resource) { 
    return $resource('/cakephp/demo_comments/:action/:id/:page/:limit:format', { id:'@id', 'page' : '@page', 'limit': '@limit' }, { 
     'initialize' : { method: 'GET', params: { action : 'initialize', format: '.json' }, isArray : true }, 
     'save': { method: 'POST', params: { action: 'create', format: '.json' } }, 
     'query' : { method: 'GET', params: { action : 'read', format: '.json' } , isArray : true }, 
     'update': { method: 'PUT', params: { action: 'update', format: '.json' } }, 
    }); 

}).

+1

Dan, rozpoznaję twoje imię z kanciastej listy mailingowej :-). Chciałem dodać niestandardowe metody do usługi. Mógłbym stworzyć inny i wstrzyknąć również, ale zastanawiałem się, czy mogę uniknąć tworzenia usługi tylko po to, aby zwrócić obiekt zasobu, ale zawrzeć bardziej powiązaną funkcjonalność. Co myślisz? – bsr

+0

Nie jestem pewien, że rozumiem, możesz dodać dowolne niestandardowe metody do obiektu zasobu, jeśli te domyślne nie spełniają Twoich potrzeb –

+0

um. Dodałem funkcję non-resource do tej fabryki/usługi. Na przykład buforowanie odpowiedzi żądania pobierania na początku i ustawienie jej w kontrolerach na wartość $ scope. Może być anty-wzorem, ale wciąż się uczę. – bsr

0

Wygląda na to, że JS skarży się na kod dla odtwarzacza. Domyślam się, że Player= $resource('/api/Player/:_id', {}) powoduje, że Player ma wywołanie właściwości query. Zmieniony formularz nie powoduje, że ta właściwość ma wartość Player.

+0

Nadal uczę się JS, więc próbuję zrozumieć dlaczego. Jak to się zmieni, jeśli owiniemy obiekt? – bsr

+0

jeśli zajrzysz do funkcji '$ resource', może ona mieć' query' jako właściwość zwracanego obiektu. Ale zmieniłeś na '{ zasób: $ resource ('/ api/Player /: _ id', {}) }', który nie ma właściwości o nazwie 'query' –

+0

, więc nie pozwala na łańcuch metody? – bsr

0

Dobrze, po kilku próbach zadziałały następujące.

Player = { 
      resource: function() { 
        return $resource('/api/Player/:_id', {}) 
      } 
     }; 

W tym wyraźnie zwracam obiekt zasobu. Ale nie potrafi wyjaśnić, jak to się różnić od

resource: $resource('/api/Player/:_id', {})