2016-10-13 7 views
0

動的に作成されている関数内で使用するために、自分のプロバイダの$ getに$ httpを注入しようとしています。それは関数を構築し、私のコントローラは正常に関数を呼び出しますが、作成された関数の内部では、エラーは$http is not definedと表示されます。この依存性を注入して利用可能にする別の方法がありますか?

(function(){ 
    angular.module('app').provider('rest', rest); 

    function rest(){ 
     endpointObjs = []; 
     return { 

      addEndpoint:function(name, request, endpoint){ 
       obj = {}; 
       obj.name = name; 
       obj.request = request; 
       obj.endpoint = endpoint; 
       endpointObjs.push(obj); 

      }, 
      $get:['$http', function($http){ 

       endpoints = []; 
       for(i=0;i<endpointObjs.length;i++){ 
        endpoints[endpointObjs[i].name] = new Function("return $http({ url:'" + endpointObjs[i].endpoint + "', method:'" + endpointObjs[i].request + "'});") 
       } 

       return {endpoints:endpoints}; 
      }] 
     }; 
    } 
})(); 

EDIT:

私の最終目標は、誰かがアプリケーションのための設定で自分の残りのすべてのエンドポイントを設定するには、その後、彼らはコントローラにプロバイダーを注入することができますし、呼び出すことができますプロバイダを作成することです

それらがconfigで定義した自動生成された関数です。 new Functionによって作成された restProvider.addEndpoint("allSoftware", "GET", "software/all");

controller.js rest.endpoints.allSoftware().then(function(data){....});

+0

ことだからそれはです無名関数ではありません。文字列から解析される関数です。これは 'eval'とほぼ同じです。 '= function(){return $ http({url:...')のような無名関数を実際に作成しないのはなぜですか? –

+0

このように関数を作成することは、達成しようとしているものには適していません。興味深いのは、私が次のように変更したときです: 'new + return(+ url: '" + endpointObjs [i] .endpoint + "メソッド、 「isObject」が定義されていない別のエラーが発生しました。実際にはこの時点で$ http関数を呼び出しても、角度のisObject関数には到達できません。 – CraigR8806

+0

これを使用する方法を含めるように質問してください。これは私の提案と似た方法で行うことができると信じているので。 –

答えて

0

機能は、その作成コンテキストにバインドされたクロージャを作成しない

あるconfig.js。それらは常にグローバルスコープで作成されます。

代わりにfunction expressionを使用してください。

$get:['$http', function($http){ 

    endpoints = []; 
    for(let i=0;i<endpointObjs.length;i++){ 
     let config = { 
      url: endpointObjs[i].endpoint, 
      method: endpointsObj[i].request 
     }; 
     let fn = function() { return $http(config) }; 
     endpoints[endpointObjs[i].name] = fn; 
    }; 

    return {endpoints:endpoints}; 
}] 

だけでなく、その作成コンテキストにバインドされたクロージャを作成することができるという彼らは残りのコードで解析されているように、関数式は、より効率的です。


だから、最終的に、私はパラメータがコントローラ

から渡されるため、これができるようにしたいと思い次に、関数式にparamsの引数を追加します。

let fn = function(params) { 
     if (params) { 
      config.params = params; 
     }; 
     return $http(config); 
}; 
+0

最終的に私はこれを許可したいサービスを実装しているコントローラーから渡されるパラメーター。この動的関数生成の方法を使用して、 'config(config、params:{})'を実行できるようにするために、すべてが 'config'内に囲まれているので、その機能をどのように提供しますか? – CraigR8806

関連する問題