6

我現在正在學習AngularJS的方法。我在很大程度上必須熟悉Angular處理依賴注入的方式,但是我找不到答案。在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服務,所以我可以嘲笑它的測試。但是,我已經在課堂上硬編碼了我的Web服務的根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])