2012-06-28 26 views
8

En lugar de publicar en la lista de correo de Angular, creo que esto puede ser más una pregunta de javascript. Espero que la comunidad SO también pueda dar una respuesta más rápida.AngularJS - crear un objeto de servicio

Estoy tratando de encapsular los datos en un servicio e inyectarlos en el controlador.

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

lanza una excepción

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

$scope.resource = Player.Player.resource.get({_id:$routeParams._id}); también tiros de error

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

las obras siguientes.

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

mi intención es añadir más datos y método para Player. Entonces, ¿cómo puedo hacer que el primero (forma de objeto) funcione?

+0

Interesante. Es 'Player: $ resource ('/ api/Player /: _ id', {})' javascript válido? –

+0

lo siento muchísimo, mientras tanto estaba editando. funciona si asigno una variable y acceso a través de ella, pero no si la asigna dentro de un objeto. gracias – bsr

+0

@ GraciaShao 'Jugador: $ recurso ('/ api/Jugador /: _ id', {})' sí si es parte de una definición de miembro ... – jcolebrand

Respuesta

6

Usted está creando una fábrica, esta es la forma atípica de hacer. No quieres devolver una instancia. Angular le dará una instancia en su controlador.

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

Aquí hay un servicio que escribí para interactuar con un servicio REST cakephp. Lo escribí hace un tiempo, así que tómalo como ilustración, puedo refactorizar.

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, reconozco su nombre de la lista de correo angular :-). Quería agregar algunos métodos personalizados al servicio. Pude crear otro e inyectarlo también, pero me preguntaba si podría evitar crear un servicio solo para devolver un objeto de recurso, pero encapsular más funcionalidades relacionadas. ¿Qué piensas? – bsr

+0

no estoy seguro Entiendo, puede agregar cualquier método personalizado que desee a un objeto de recurso, si los predeterminados no satisfacen sus necesidades –

+0

um. Estaba agregando funciones que no son de recursos a esta fábrica/servicio. Por ejemplo, almacenar en caché la respuesta de solicitud de obtención inicialmente y establecerla en $ scope en los controladores. Puede ser un antipatrón, pero todavía estoy aprendiendo. – bsr

0

Parece que el JS se queja de algún código para Player. Supongo que Player= $resource('/api/Player/:_id', {}) hace que Player tenga una propiedad llamada query. El formulario que ha cambiado no hace que Player tenga esa propiedad.

+0

Todavía estoy aprendiendo JS, así que trato de descubrir por qué. ¿Cómo es diferente si se envuelve en un objeto? – bsr

+0

si observa la función '$ resource', podría tener' query' como una propiedad del objeto de retorno. Pero cambiaste a '{ recurso: $ recurso ('/ api/Player /: _ id', {}) }', que no tiene la propiedad llamada 'query' –

+0

entonces, ¿no permite encadenar el métodos? – bsr

0

Ok, después de algunos intentos, funcionó.

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

En esto devuelvo explícitamente el objeto de recurso. Pero no pueden explicar cómo se diferencia de

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

Cuestiones relacionadas