访问angularjs中的$ resource实例url

时间:2014-01-11 14:11:39

标签: angularjs angular-resource

我使用以下代码创建了资源实例:

$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

如何从资源实例获取网址?

$scope.book.$$url 

未定义。

1 个答案:

答案 0 :(得分:0)

我认为这是一个观点问题,应该在那里处理。我现在无法测试,但我的预感是在视图模板中构建网址。

因此,书籍详细信息模板将是:

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

您可能需要使用相对路径,但这应该可以解决问题。您希望将这些问题排除在控制器和服务之外,并且角色附带了大量工具,例如ngSrc directive,就可以做到这一点。

修改

也许为了更好地回答原始问题,这是另一种解决方案。使用装饰器模式扩展 $ resource service api,将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场景,但它显示了概念证明。

请参阅this plunker。