5

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

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'
4

2 回答 2

12

Product.prototype.all定义一个实例方法。

您应该将其定义为静态方法Product.all = function(){...]

只有这样你才能调用它$scope.products = Product.all();

于 2013-03-04T15:18:41.603 回答
3

我认为这是因为您实际上还没有实例。你需要这样做:

$scope.products = new Product();
// now you can run the all function
$scope.products.all()

您的另一个选择是在服务级别定义 all() 方法。除了添加到仅在 new 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(),在实例上拥有 product.$all()。

于 2013-03-04T15:07:48.980 回答