2013-03-04 3 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

$ 자원의 프로토 타입에 추가하는 예에 대한 링크를 제공 할 수 있습니까? 나는 그걸 본 적이 기억이 없다. –

답변

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() 메소드를 호출하는 방법이 포함됩니다. –

관련 문제