2016-10-13 3 views
0

Я пытаюсь ввести $ http в $ get моего провайдера, чтобы использовать внутри функции, которая создается динамически. Он строит функцию, и мой контроллер успешно вызывает эту функцию, но в то время как внутри созданной функции возникают ошибки, указывающие $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.js restProvider.addEndpoint("allSoftware", "GET", "software/all");

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

+0

Это потому, что это не анонимная функция; это функция, которая анализируется из строки, что в значительной степени эквивалентно 'eval'. Почему бы не создать анонимную функцию, например '= function() {return $ http ({url: ...'? –

+0

Создание функции таким образом не подходит для того, чего я пытаюсь достичь. Мне нужно быть более динамичный, чем это позволит. Интересно, когда я перехожу к: 'new Function (« return »+ $ http +» ({url: '"+ endpointObjs [i] .endpoint +"', method: '"+ endpointObjs [i] .request +"', params: '"+ endpointObjs [i] .params +"'}); ")' Я получаю другую ошибку 'isObject' не определен. вызывая функцию $ http в этой точке, но не может достичь функции isObject угловой функции, видимо, – CraigR8806

+0

. Пожалуйста, отредактируйте свой вопрос, чтобы включить, как вы используете это, потому что я считаю, что вы можете сделать это так же, как я предлагаю. –

ответ

0

функции, созданные new Function не создают затворы, связанные с их контексте создания; они всегда создаются в глобальном масштабе.

Вместо этого используйте 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

So в конечном итоге я бы хотел, чтобы это разрешало для параметров, которые должны быть переданы от контроллера, реализующего службу. Используя этот метод создания динамических функций, как бы я мог предоставить эту функциональность, поскольку все вложено в 'config', я смогу выполнить' $ http (config, params: {}) '? – CraigR8806

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

  • Нет связанных вопросов^_^