2012-06-28 17 views
8

Invece di postare nella mailing list Angular, penso che questa potrebbe essere più una domanda javascript. Spero che la comunità SO possa anche dare una risposta più rapida.AngularJS - creazione di un oggetto servizio

Sto cercando di incapsulare i dati in un servizio e di iniettarli nel controller.

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']; 

viene generata un'eccezione

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

$scope.resource = Player.Player.resource.get({_id:$routeParams._id}); tiri anche

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

le opere sotto l'errore.

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']; 

la mia intenzione è quella di aggiungere altri dati e il metodo per Player. Quindi, come posso fare il primo (modulo oggetto) funziona!

+0

Interessante. 'Player: $ resource ('/ api/Player /: _ id', {})' javascript valido? –

+0

è spiacente, stavo modificando nel frattempo. funziona se assegno ad una variabile e accedo attraverso di essa, ma non se la assegni all'interno di un oggetto. grazie – bsr

+0

@GraceShao 'Player: $ resource ('/ api/Player /: _ id', {})' sì se fa parte di una definizione membro ... – jcolebrand

risposta

6

Si sta creando una fabbrica, questo è il modo atipico di fare. Non vuoi restituire un'istanza. Angular ti darà un'istanza nel tuo controller.

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

Ecco un servizio che ho scritto per interagire con un servizio RIP di cakephp. L'ho scritto un po 'di tempo fa, quindi prendilo come illustrazione, posso refactoring.

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, riconosco il tuo nome dalla mailing list angolare :-). Volevo aggiungere alcuni metodi personalizzati al servizio. Potrei creare anche un altro e iniettare, ma mi chiedevo se potevo evitare di creare un servizio solo per restituire un oggetto risorsa, ma incapsulare più funzionalità correlate. Cosa ne pensi? – bsr

+0

non sono sicuro di aver capito, puoi aggiungere qualsiasi metodo personalizzato che desideri ad un oggetto risorsa, se quelli predefiniti non soddisfano le tue esigenze –

+0

um. Stavo aggiungendo una funzione non risorsa a questa fabbrica/servizio. Ad esempio, memorizzare nella cache la risposta di richiesta iniziale e impostarla su $ scope nei controller. Può essere un anti-modello, ma sto ancora imparando. – bsr

0

Sembra che il JS si stia lamentando del codice per Player. Immagino che Player= $resource('/api/Player/:_id', {}) faccia chiamare Player una proprietà query. Il modulo che hai modificato non ha la proprietà Player.

+0

Sto ancora imparando JS, quindi cercando di capire perché. Com'è diverso se avvolto in un oggetto? – bsr

+0

se si esamina la funzione '$ risorsa', potrebbe avere' query' come proprietà dell'oggetto restituito. Ma hai cambiato in '{ risorsa: $ risorsa ('/ api/Player /: _ id', {}) }', che non ha la proprietà chiamata 'query' –

+0

così, non permette di concatenare metodi? – bsr

0

Ok, dopo alcuni tentativi ha funzionato.

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

In questo restituisco esplicitamente l'oggetto risorsa. Ma non si può spiegare come si differenzia da

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