如何将一个服务/工厂注入到控制器中使用?
问题的出现原因是,当myApp、service和controller位于不同的文件中时,需要找到一种方法将service注入到controller中。
解决方法是,在service文件的顶部使用myapp=angular.module('myApp')来获取之前定义的myapp。然后,在页面中包含这两个.js文件即可。
以下是解决方法的代码示例:
文件1.js:
var myapp = angular.module('myApp',[]); myapp.service('MyService',['$http', function($http) { return { doSomeThing: function() { // do something here with $http or whatever }, doSomeThingElse: function() { } } }]);
文件2.js:
myapp.controller('MyController',['MyService',function(MyService) { MyService.doSomeThing(); }]);
在页面中引入这两个文件:
这样,MyService就会被成功注入到MyController中。
在搜索了几个小时后,我偶然发现了一个完美的示例,演示了如何以一种简洁而简单的方式向控制器注入一个服务。有趣的是,这个示例实际上是在AngularJS官方文档的AngularJS概述部分中找到的 - 真是倒霉。
不管怎样,下面是示例代码:
HTML:
Invoice:Quantity:Costs:Total: {{invoice.total(c) | currency:c}}
控制器:
angular.module('invoice2', ['finance2']) .controller('InvoiceController', ['currencyConverter', function(currencyConverter) { this.qty = 1; this.cost = 2; this.inCurr = 'EUR'; this.currencies = currencyConverter.currencies; this.total = function total(outCurr) { return currencyConverter.convert(this.qty * this.cost, this.inCurr, outCurr); }; this.pay = function pay() { window.alert("Thanks!"); }; }]);
服务:
angular.module('finance2', []) .factory('currencyConverter', function() { var currencies = ['USD', 'EUR', 'CNY']; var usdToForeignRates = { USD: 1, EUR: 0.74, CNY: 6.09 }; var convert = function (amount, inCurr, outCurr) { return amount * usdToForeignRates[outCurr] / usdToForeignRates[inCurr]; }; return { currencies: currencies, convert: convert }; });
希望这个简单的示例可以帮助那些也发现学习AngularJS很困难的人!