6

Я изучаю свой путь вокруг AngularJS на данный момент. Я в значительной степени справился с тем, как Угловая управляет инъекцией зависимости, но есть пробел, на который я не могу найти ответ.Инъекция примитивного типа в AngularJS

Скажите, что у меня есть служба, которая извлекает данные из Интернета по запросу пользователя; это может выглядеть следующим образом:

var webBasedServiceModule = angular.module('WebBasedService', []); 

webBasedServiceModule 
    .factory('webBasedService', function ($http) { 
     var rootUrl = "http://example.com/myApi?query="; 
     return { 
      getData: function(query) { 
       return $http.get(rootUrl + query) 
        .then(function(httpCallbackArg) { 
         return doSomething(httpCallbackArg); 
        }); 
      } 
     } 
    }); 

Я инъекционная службу HTTP $, так что я могу дразнить его для тестирования. Тем не менее, у меня есть корневой URL-адрес моей веб-службы, жестко закодированный в классе. В идеале я хотел бы отделить этот URL-адрес от класса сервиса и ввести его в качестве зависимости. Однако я не вижу способа вставить строку или другой примитив в угловую фабричную функцию. Я бы идеально, как код, чтобы выглядеть следующим образом:

var webBasedServiceModule = angular.module('WebBasedService', []); 

webBasedServiceModule 
    .factory('webBasedService', function ($http, rootUrl) { 
     return { 
      getData: function(query) { 
       return $http.get(rootUrl + query) 
        .then(function(httpCallbackArg) { 
         return doSomething(httpCallbackArg); 
        }); 
      } 
     } 
    }); 

Одно решение, которое я могу видеть только создать UrlProviderService и внедрить эту услугу в WebBasedService модуль, а затем вызвать urlProvider.Url или аналогичный. Это кажется немного вонючим: кажется, что излишним, чтобы создать совершенно новую услугу только для одной части данных конфигурации. Я могу даже представить себе, что я мог бы создать службу, которая является строкой, например, так:

var urlServiceModule = angular.module('UrlService', []); 

urlServiceModule 
    .factory('rootUrl', function() { 
     return "http://example.com/myApi?query="; 
    }); 

Это кажется злоупотреблением концепции службы, хотя.

Предоставляет ли AngularJS «стандартное» решение проблемы ввода примитивов в качестве данных конфигурации? Или я просто использую одно из решений выше?

ответ

9

Вы можете использовать .constant() для ввода в вашу конфигурацию.

var app = angular.module("app", []); 

app.constant("rootUrl", "http://www.example.com"); 

app.factory('webBasedService', function ($http, rootUrl) { 
    return { 
     rootUrl: rootUrl 
    } 
}); 

app.controller("MyCtrl", ["$scope", "webBasedService", function ($scope, webBasedService) { 
    $scope.rootUrl = webBasedService.rootUrl; 
}]); 

Example on jsfiddle

0

Развивая (фантастический) ответ выше - который был точно подсказкой мне нужна - вот немного другой аромат для тех из нас, кто предпочитает названные функции. Я был озадачен, как это сделать для AGES, так что он приветствует Марка!

angular.module('myModule', []) 
    .constant('rootUrl','http://localhost:3001') 
    .factory('dataService', ['$http', 'rootUrl', dataServiceImplementation]) 
    .controller('MainController', ['$scope', 'dataService', mainController])