Acceso a la URL de la instancia de $ Resource en Angularjs
-
26-12-2019 - |
Pregunta
He creado una instancia de recursos con este código:
$scope.book = Book.get({bookId:1});
Aquí está el código de servicio:
var bookServices=angular.module('bookServices',['ngResource']);
bookServices.factory('Book',['$resource',
function($resource){
return $resource('/books/:bookId',{},{});
}]);
Libro tiene imagen de portada, accesible por URL: /books/ ,bookid/cover.png
¿Cómo puedo obtener la URL de la instancia de recursos?
$scope.book.$$url
no está definido.
Solución
Creo que esto es una preocupación víspera y debe ser manejada allí. No puedo probar esto ahora, pero mi corazonada sería construir la URL en la plantilla de su vista.
Entonces, la plantilla de detalle del libro sería:
<div>
<p>Name: {{ book.name }}</p>
<img ng-src="/books/{{ book.id }}/cover.png" alt="cover">
</div>
Es posible que deba jugar con el camino relativo, pero eso debería hacer el truco. Desea mantener estas preocupaciones a cabo su controlador y servicios, y la angular viene con muchas herramientas, como el Directiva NGSRC , para hacer precisamente eso.
editar
Tal vez para responder mejor la pregunta original, aquí hay otra solución. Use el Patrón de Decorador a Extienda la API de servicio de recursos $ para exponer la URL como propiedad de un objeto de recursos.
Decorar el servicio de recursos $ como este:
function ResourceDecorator($delegate) {
var decorator = function (url, paramDefaults, actions) {
var resource = $delegate(url, paramDefaults, actions),
getSave;
// expose the parameterized url of the resource
resource.$url = url;
// expose urls for individual resources by extending
// the get method to return a class object that has
// a url property
getSave = resource.get;
resource.get = function(parameters, success, error) {
var r = getSave(parameters, success, error),
paramName;
// get the name of the parameter, assuming just ONE
paramName = Object.keys(parameters)[0];
// replace the parameter with it's value
r.$url = url.replace(':' + paramName, parameters[paramName]);
// return the decorated class object back
return r;
};
return resource;
};
return decorator;
}
app.config(['$provide', function ($provide) {
$provide.decorator('$resource', ['$delegate', ResourceDecorator]);
}]);
Luego tendrá la URL disponible como una propiedad en su objeto de recursos.
$scope.book.$url
Tenga en cuenta que hay un Whing Wack de $ escenarios de recursos que este simple ejemplo no es compatible, pero muestra una prueba de concepto.
Consulte este plunker.