我还在学习AngularJS,并对他们的依赖注入风格有疑问。例如,假设我有DataProcessor
服务,其processData
方法接受uri
参数,并且需要读取该数据(可能是xml,json等)。 )然后对它执行一些操作。 DataProcessor
构造函数接受了DataReader
接口的实现,该接口知道如何读取某种文件类型。以下是我所谈论的一些示例服务:
// implementations of the DataReader interface
myApp.service('XmlDataReader', function() {
this.readData = function(uri) {
// read xml data from uri
}
}]);
myApp.service('JsonDataReader', function() {
this.readData = function(uri) {
// read json data from uri
}
}]);
// data processing service that takes in an implementation of a DataReader
myApp.service('DataProcessor', ['DataReader', function(DataReader) {
this.processData = function(uri) {
var readData = DataReader.readData(uri);
// process data and return it
}
}]);
从典型的依赖注入角度来看,特定类型的DataReader
可以传递到DataProcessor
并像这样使用:
var dataProcessor = new DataProcessor(new JsonDataReader());
var processedData = dataProcessor.processData('dataz.json');
AngularJS的做法是什么?
答案 0 :(得分:7)
这是一篇关于这个主题的好文章http://phonegap-tips.com/articles/conditional-dependency-injection-with-angularjs.html
答案 1 :(得分:2)
做这样的事情:
myApp.service('DataProcessor', ['$injector', 'valueRecipeOfTheServicename', function($injector, valueRecipeOfTheServicename) {
this.processData = function(uri) {
var service = $injector.get(valueRecipeOfTheServicename);
// process data and return it
}
}]);
$ injetcor.get()检索服务
答案 2 :(得分:1)
基于Noypi Gilas answer,我使用服务名称启动控制器并通过$ injetcor.get()检索它:
len(n) in reader
答案 3 :(得分:0)
由于DI的工作方式 - 您不必真正创建服务实例。你所做的就是将所需的服务注入控制器,它应该可以正常工作。在上面的例子中,您的控制器可能被定义为:
var app = angular.module('App', ['DataProcessor']);
function MyController($scope, DataProcessor) {
var uri = '';
DataProcessor.processData(uri);
}
这里唯一需要做的就是确保“App”是您在“ng-app”指令中指定的名称,并确保您的页面包含带有“DataProcessor”的JS文件你包括角度app模块(从技术上讲,这些甚至可以在同一个文件中定义)。希望这有帮助!
修改强>
顺便说一句,如果你需要缩小 - 以下是你如何定义控制器:
var app = angular.module('App', ['DataProcessor']);
// if you need to minify:
var MyController = ['$scope', 'DataProcessor',
function($scope, DataProcessor) {
var uri = '';
DataProcessor.processData(uri);
}
];
其他建议
我目前对服务的理解是用于在控制器之间共享数据或代码。如果此数据处理特定于该控制器,您可能会考虑将“ProcessData”实现直接移动到控制器中。有时这样的更改比处理服务中的数据更简单。如果您确实处理了服务中的数据,您可能仍希望将该数据写回范围。在这种情况下,您可以将$ scope作为参数传递到服务例程中。由于我对您的用例不太了解,所以只需要考虑这些建议。祝你好运!