首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制器是使用工厂函数创建的?

控制器是使用工厂函数创建的?
EN

Stack Overflow用户
提问于 2015-01-10 19:34:46
回答 3查看 90关注 0票数 0

我是angularJS的新手,正在通过角度测试。我遇到了这条线,控制器是使用工厂函数创建的。

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

请解释工厂在这个上下文中的含义是什么,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-10 21:05:45

您所指的上一节中缺少的关键引号是:

首先,有一个新的JavaScript文件,其中包含一个所谓的“控制器”。更确切地说,该文件包含一个构造函数,用于创建实际的控制器实例。

如果这是一个实际的角工厂,那就更有意义了。但是,控制器是类似于角工厂、服务和提供者的实例。

一个工厂,实际上是一个Javascript设计模式,也许在这里阅读会更有意义。

为了使控制器工作,实例必须存在,这样双向绑定才能发生。因此,基本上,控制器的一个实例被创建。角度控制器页面很好地解释了这一点:

“当控制器通过ng控制器指令附加到DOM时,角将使用指定的Controller构造函数实例化一个新的Controller对象。一个新的子作用域将作为控制器构造函数的可注入参数作为$scope。”这是链接。

但是,在控制器的情况下,您很可能会将项目存储在$scope上,而不是“this”。因此,它们以这种方式将控制器与工厂分开,因为它们不返回自己的可访问实例,而是通过$scope或“this”将其属性绑定到视图。

,我不是说他们指的是角工厂。我认为这种措辞的原因与用于服务工厂功能相同的措辞有关

“应用程序开发人员可以自由地通过注册服务的名称和服务工厂函数来定义自己的服务,并使用一个角模块。

服务工厂函数生成单个对象或函数,该对象或函数表示应用程序其余部分的服务。服务返回的对象或函数被注入到指定依赖于服务的任何组件(控制器、服务、筛选器或指令)中。

他们举了这个例子:

代码语言:javascript
复制
var myModule = angular.module('myModule', []);
myModule.factory('serviceId', function() {
  var shinyNewServiceInstance;
  // factory function body that constructs shinyNewServiceInstance
  return shinyNewServiceInstance;
});

因此,当您看到他们说是从工厂函数创建的,他们只是说使用以下模式:

代码语言:javascript
复制
.controller('PersonCtrl', [
  'PersonFactory'
  function(PersonFactory) {
    this.name = 'Tom';
    console.log(PersonFactory.name); //would print 'Tom'
}]);

.factory("PersonFactory", [
  function () {
    return {
      name: 'Tom'
    };
}]);

我希望这能有所帮助,或者也许有人能在我的解释中更加简洁,并编辑这个描述。

票数 0
EN

Stack Overflow用户

发布于 2015-01-10 20:54:37

这意味着您为AngularJS提供了一个函数,它可以执行所需的次数,以生成控制器的实例。因此,要从链接到的页面中获取该示例:

代码语言:javascript
复制
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行以function(currencyConverter) {开头的函数是工厂函数。

每当页面有一个使用InvoiceController的位置时,AngularJS将(实质上)对该工厂函数执行以下操作,传递它所具有的任何依赖项:

代码语言:javascript
复制
var currencyConverter = ...; // obtain a currency converter from the factory
var theController = new thatFactoryFunction(currencyConverter);

然后它将使用返回的值作为控制器。它将分别为每个InvoiceController指示页面,为每个页面创建一个单独的实例。

(我强调,上面的代码纯粹说明了AngularJS正在做什么,而不是它所使用的代码的实际表示。)

票数 0
EN

Stack Overflow用户

发布于 2015-01-10 22:00:07

控制器实例的创建非常有趣。人们可能会认为它是用new InvoiceController(...)创建的,而且更确切地说,这个文件包含一个构造函数,它创建了实际的控制器实例,但事实并非如此。实际上,它是这样创建的:

代码语言:javascript
复制
instance = Object.create(controllerPrototype);

然后,构造函数函数被调用为函数:

代码语言:javascript
复制
return fn.apply(self, args); //self == instance

老实说,我们只能猜测作者所说的工厂功能是什么意思。这可能是因为控制器不是由new创建的。因此,构造函数可能被称为工厂,也可能是内部工厂函数。它也可能只是糟糕的措辞,甚至是一个错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27880375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档