Angularjs 是否使用工厂函数创建控制器?
我是angularJS新手,正在阅读angular文档。我遇到了这一行 我试图找到这意味着什么,找到了什么是工厂、服务和供应商,但这不适合这里。 如何使用factory函数创建控制器Angularjs 是否使用工厂函数创建控制器?,angularjs,Angularjs,我是angularJS新手,正在阅读angular文档。我遇到了这一行 我试图找到这意味着什么,找到了什么是工厂、服务和供应商,但这不适合这里。 如何使用factory函数创建控制器 请解释工厂在本上下文中的含义这意味着您为AngularJS提供了一个函数,它可以根据需要多次执行,以生成控制器实例。因此,以您链接到的页面为例: angular.module('invoice3', ['finance3']) .controller('InvoiceController', ['currencyC
请解释工厂在本上下文中的含义这意味着您为AngularJS提供了一个函数,它可以根据需要多次执行,以生成控制器实例。因此,以您链接到的页面为例:
angular.module('invoice3', ['finance3'])
.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!");
};
}]);
在第2行以函数(currencyConverter){
开始的函数是工厂函数
每当页面有一个使用InvoiceController
的位置时,AngularJS将(本质上)使用该工厂函数执行以下操作,传递它所具有的任何依赖项:
var currencyConverter = ...; // obtain a currency converter from the factory
var theController = new thatFactoryFunction(currencyConverter);
然后,它将使用作为控制器返回的值。它将对指示页面的每个InvoiceController
分别执行此操作,并为每个控件创建单独的实例
(我强调,上面的代码纯粹是AngularJS正在做什么的说明,而不是它使用的代码的实际表示。)您在前面提到的部分中缺少的关键引用如下: 首先,有一个新的JavaScript文件包含一个所谓的“控制器”。更确切地说,该文件包含一个创建实际控制器实例的构造函数 如果这是一个实际的angular工厂,它会更有意义。但是,控制器是实例,就像angular工厂、服务和提供者一样 工厂实际上是一种Javascript设计模式 要使控制器工作,实例必须存在,才能进行双向绑定。因此,基本上创建了控制器的实例。angular controller页面对此进行了详细说明,包括: 当控制器通过ng Controller指令连接到DOM时,Angular将使用指定控制器的构造函数实例化一个新的控制器对象。新的子作用域将作为可注入参数以$scope的形式提供给控制器的构造函数 但是,如果是控制器,您最有可能将项目存储在$scope而不是'this'上。因此,它们以这种方式将控制器与工厂分开,因为它们不会返回自身的可访问实例,而是通过$scope或'this'将其属性绑定到视图 说得清楚一点,我并不是说他们指的是角工厂。我相信这句话的原因与同样的措辞有关: “应用程序开发人员可以通过注册服务的名称和服务工厂功能,使用Angular模块自由定义自己的服务 服务工厂函数生成表示应用程序其余部分的服务的单个对象或函数。服务返回的对象或函数被注入任何指定服务依赖性的组件(控制器、服务、筛选器或指令)。” 他们举了一个例子:
var myModule = angular.module('myModule', []);
myModule.factory('serviceId', function() {
var shinyNewServiceInstance;
// factory function body that constructs shinyNewServiceInstance
return shinyNewServiceInstance;
});
因此,当你看到他们说从工厂函数创建时,他们只是说使用以下模式:
.controller('PersonCtrl', [
'PersonFactory'
function(PersonFactory) {
this.name = 'Tom';
console.log(PersonFactory.name); //would print 'Tom'
}]);
.factory("PersonFactory", [
function () {
return {
name: 'Tom'
};
}]);
我希望这会有所帮助,或者有人可以在我的解释中更简洁一些,并编辑此说明。控制器实例的创建很有趣。人们可能会认为它是使用
新的InvoiceController(…)创建的
,更确切地说,这句话也表明,该文件包含一个创建实际控制器实例的构造函数,但事实并非如此。实际上它是这样创建的:
instance = Object.create(controllerPrototype);
之后,构造函数被称为函数:
return fn.apply(self, args); //self == instance
老实说,我们只能猜测作者所说的工厂函数是什么意思。这可能是因为控制器不是由
new
创建的。也许构造函数函数因此被称为工厂,或者它是内部工厂函数。它也可能是不好的措辞,甚至是一个错误。基于该q的上下文uote,我很确定OP行中引用的术语“工厂函数”并不是指AngularJS工厂。我认为这很可能是一个键入错误,作者实际上是想键入“构造函数”,但在键入时考虑的是工厂。