Angularjs 是否使用工厂函数创建控制器?

Angularjs 是否使用工厂函数创建控制器?,angularjs,Angularjs,我是angularJS新手,正在阅读angular文档。我遇到了这一行 我试图找到这意味着什么,找到了什么是工厂、服务和供应商,但这不适合这里。 如何使用factory函数创建控制器 请解释工厂在本上下文中的含义这意味着您为AngularJS提供了一个函数,它可以根据需要多次执行,以生成控制器实例。因此,以您链接到的页面为例: angular.module('invoice3', ['finance3']) .controller('InvoiceController', ['currencyC

我是angularJS新手,正在阅读angular文档。我遇到了这一行

我试图找到这意味着什么,找到了什么是工厂、服务和供应商,但这不适合这里。 如何使用factory函数创建控制器


请解释工厂在本上下文中的含义

这意味着您为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工厂。我认为这很可能是一个键入错误,作者实际上是想键入“构造函数”,但在键入时考虑的是工厂。