我已经按照这些示例进行了操作,但在向资源原型添加自定义方法时显然出现了问题。
app.factory('Product',function ($resource,$cacheFactory) {
var Product = $resource('/the/url/:id', {id: '@id'}),
cache = $cacheFactory('Product'),
products;
Product.prototype.all = function(){
products = cache.get('all');
if(typeof products == 'undefined'){
products = Product.query();
cache.put('all',products);
}
return products;
};
return Product;
})
在控制器中我$scope.products = Product.all();
但我得到了
TypeError: Object function Resource(value) {
copy(value || {}, this);
} has no method 'all'
答案 0 :(得分:12)
Product.prototype.all
定义了一个实例方法。
您应该将其定义为静态方法Product.all = function(){...]
。
只有这样,您才能使用$scope.products = Product.all();
调用它。
答案 1 :(得分:3)
我认为这是因为你还没有实例。你需要这样做:
$scope.products = new Product();
// now you can run the all function
$scope.products.all()
您的另一个选择是在服务级别定义all()方法。而不是添加到仅在新Product()之后可用的原型,您可以修改如下:
app.factory('Product',function ($resource,$cacheFactory) {
var Product = $resource('/the/url/:id', {id: '@id'}),
cache = $cacheFactory('Product'),
products;
Product.all = function(){
products = cache.get('all');
if(typeof products == 'undefined'){
products = Product.query();
cache.put('all',products);
}
return products;
};
Product.prototype.$all = function () {
Product.all.call(this);
}
return Product;
})
通过这种方式,您将在资源和产品上使用Product.all()。实例上的$ all()。