доступ к URL-адресу экземпляра $ ресурса в angularjs

Я создал экземпляр ресурса с помощью этого кода:

$scope.book = Book.get({bookId:1});

Вот сервисный код:

var bookServices=angular.module('bookServices',['ngResource']);

bookServices.factory('Book',['$resource',
    function($resource){
        return $resource('/books/:bookId',{},{});
    }]);

Книга имеет обложку, доступную по адресу: /books/:bookId/cover.png

Как я могу получить URL-адрес экземпляра ресурса?

$scope.book.$$url 

не определено.


person Artyom Chernetsov    schedule 11.01.2014    source источник
comment
Если вам нужен только URL-адрес изображения обложки книги, вы можете сформулировать его, используя идентификатор книги: var coverPageUrl = '/books/' + $scope.book.id + '/cover.png';   -  person Sunil D.    schedule 11.01.2014
comment
это решение, но мне нужно повторить URL-адрес ресурса, используемый при построении ресурса. Я думаю, должен быть более красивый способ   -  person Artyom Chernetsov    schedule 11.01.2014


Ответы (1)


Я думаю, что это проблема просмотра, и ее следует решать там. Я не могу проверить это сейчас, но я подозреваю, что нужно создать URL-адрес в вашем шаблоне представления.

Таким образом, шаблон сведений о книге будет таким:

<div>
     <p>Name: {{ book.name }}</p>         
     <img ng-src="/books/{{ book.id }}/cover.png" alt="cover">
</div>

Возможно, вам придется поиграть с относительным путем, но это должно помочь. Вы хотите, чтобы эти проблемы не касались вашего контроллера и служб, и angular поставляется с множеством инструментов, таких как директива ngSrc, чтобы сделать именно это.

ИЗМЕНИТЬ

Возможно, чтобы лучше ответить на исходный вопрос, вот еще одно решение. Используйте шаблон декоратора, чтобы расширить API службы $resource, чтобы предоставить URL как свойство объекта ресурса.

Украсьте сервис $resource следующим образом:

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

}]);

Затем у вас будет URL-адрес, доступный как свойство вашего объекта ресурса.

$scope.book.$url

Обратите внимание, что есть целый набор сценариев $resource, которые этот простой пример не поддерживает, но показывает доказательство концепции.

См. этот плункер.

person Joel Skrepnek    schedule 11.01.2014
comment
Я думаю, что зеленый флаг полностью вводит в заблуждение. Этот ответ является обходным путем и не имеет ничего общего с тем, что было задано в заголовке. - person angabriel; 12.01.2014
comment
Согласованный. У меня такая же проблема, и это не реальное решение. - person Joe; 30.01.2014
comment
Я бы проверил URL-адрес на ':', прежде чем получать ключи и заменять параметры - person Peter Hofman; 20.08.2018