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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top