Angular $ resource自定义方法

时间:2013-03-04 14:46:46

标签: angularjs

我已经按照这些示例进行了操作,但在向资源原型添加自定义方法时显然出现了问题。

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'

2 个答案:

答案 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()。