2013-03-04 12 views
5

Podążyłem za przykładami, ale najwyraźniej coś jest nie tak podczas dodawania niestandardowej metody do prototypu zasobu.

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; 
    }) 

W regulatorze zrobić $scope.products = Product.all(); ale mam

+0

Czy możesz podać link do przykładu dodania do prototypu $ resource? Nie pamiętam, żeby kiedykolwiek to widziałem. –

Odpowiedz

12

Product.prototype.all definiuje metodę instancji.

Powinieneś zdefiniować go jako metodę statyczną Product.all = function(){...].

Tylko wtedy możesz zadzwonić pod numer $scope.products = Product.all();.

+0

Dzięki, nie wiem, dlaczego w tym momencie popełniłem ten błąd XD – olanod

+3

Zrozumiałe. Te proste błędy często prześlizgują się przez skomplikowane projekty lub długie dni. – Stewie

3

Myślę, że to dlatego, że w rzeczywistości nie mają jeszcze instancji. Będziesz musiał to zrobić:

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

Inną opcją będzie zdefiniowanie metody all() na poziomie usługi. Zamiast dodawać do prototypu, który jest dostępny tylko po new product(), można modyfikować tak:.

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; 
}) 

ten sposób będziesz mieć Product.all() na zasobu i produktu $ wszystko() na instancje.

+0

Kiedy zasób jest wstrzykiwany, czy nie jest instancją zdefiniowanej usługi? Jak mogę to zrobić bez tworzenia instancji usługi? – olanod

+0

Po wstrzyknięciu otrzymuje się instancję usługi, tak, ale nie instancję zasobu. Aktualizowanie odpowiedzi w celu uwzględnienia sposobu wywołania metody all() na poziomie usługi. –

Powiązane problemy