2013-03-04 5 views
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();, но я получаю

+0

Можете ли вы предоставить ссылку для примера добавления прототипа $ resource? Я не помню, чтобы когда-либо видел это. –

ответ

12

Product.prototype.all определяет метод экземпляра.

Вы должны определить его как статический метод Product.all = function(){...].

Только тогда вы можете позвонить ему с $scope.products = Product.all();.

+0

Спасибо, я не знаю, почему в этот момент я делаю такую ​​ошибку XD – olanod

+3

Понятно. Эти простые ошибки часто легко проскакивают в сложных проектах или в длительные дни. – Stewie

3

Я думаю, это потому, что вы на самом деле не экземпляр еще. Вам нужно будет это сделать:

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

Другой вариант - определить метод all() на уровне обслуживания. Вместо того чтобы добавлять к прототипу, который доступен только после того, как новый продукт(), вы могли бы изменить, как:.

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() на ресурс и продукт $ все() на экземпляров.

+0

Когда ресурс вводится, это не экземпляр определенной службы? Как я могу это сделать без создания экземпляра службы? – olanod

+0

Когда он вводится, вы получаете экземпляр службы, да, но не экземпляр ресурса. Обновите ответ, чтобы включить способ вызова метода all() уровня сервиса. –

Смежные вопросы