2013-03-04 19 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()メソッドを呼び出す方法が含まれます。 –

関連する問題