我使用以下代码创建了资源实例:
$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
未定义。
答案 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。