【问题标题】:How does a factory internally works in AngularJS?AngularJS 内部的工厂如何运作?
【发布时间】:2015-11-20 03:29:01
【问题描述】:

我正在处理这个blog

作者提出,

当您使用 Factory 时,您会创建一个 对象,为其添加属性,然后 返回相同的对象。当您将此服务传递到您的控制器时,对象上的那些属性现在将通过您的工厂在该控制器中可用。

所以,据我了解,这一行

被替换为

作为服务对象返回 当我们调用 myFactory()

到目前为止没有问题,

现在考虑 sn-p,

<script type="text/javascript">
    var module =  angular.module('MyApp', []);

    module.factory('VaderService', function() {
        var VaderClass = function(padawan) {
            this.name = padawan;
            this.speak = function () {
                return 'Join the dark side ' + this.name;
            }
        }
        return VaderClass;
    });

    module.controller('StarWarsController', function($scope, VaderService) {
        var luke = new VaderService('luke');
        $scope.luke = luke.speak();
    });
</script>
</head>
<body ng-app="MyApp"> 
    <table ng-controller="StarWarsController">
        <tbody>
        <tr><td>{{luke}}</td></tr>
        </tbody>
    </table>
</body>

打印为,

Join the dark side luke

我不明白这里发生了什么,这行

var luke = new VaderService('luke');

我们创建了工厂 VaderService('luke')instance 传递字符串 luke作为参数,但令人惊讶的是,在

中没有定义任何参数
module.factory('VaderService', function() {...

其次,返回一个函数,即VaderClass(),而不是一个对象。 (我很清楚 javascript 中的函数是一流的对象)。

字符串luke如何传递给VaderClass函数中的参数?

【问题讨论】:

  • 但是您返回这个var VaderClass = function(padawan),这就是正在应用的内容。那里的外部功能仅用作外壳。

标签: javascript angularjs singleton factory


【解决方案1】:

如您所说,这些行没有被替换。基本上,只要您注入工厂,其中的代码就会执行一次。然后,Angular 将使用 new 执行一次 VaderService 函数。结果(因此在工厂内部返回)是将传递给您注入工厂的每个地方的对象。

请注意,与面向对象的语言相比,Angular 术语在这个领域有点违反直觉。在 Java 中,工厂用于生产某种类型的对象。在 Angular 中,这个工厂用于创建在模块之间共享的单个对象。这更像是传统面向对象说话中的单例。

如果您想要的是参数化工厂,那么您应该考虑在工厂的返回值中添加一个额外的 init() 函数,这将更改工厂内的局部变量。然后,此闭包可用于跨控制器或指令保持状态。

【讨论】:

  • @Dameas:我很难理解字符串 'luke' 是如何传递给 VaderClass 函数中的参数的。即使调用了构造函数 VaderService。(没有参数)跨度>
  • AngularJS 在内部使用 new 调用该函数一次。工厂函数的参数是空的,因为它们是用来注入依赖的。
  • 您能否扩展一下您在评论中提到的 fn AngularJs 内部调用的内容。是 VaderService 还是 VaderClass?
  • @ShirgillAnsari:你现在可以了吗?
【解决方案2】:

只要明白VaderClass 是一个构造函数。工厂只创建另一个全局VaderService 构造函数,它的作用相同。

var myfact = function(name, constructor_closure){
     window[name] = constructor_closure()
}

【讨论】:

  • 你确定 VaderClass 是一个构造函数,而不仅仅是一个普通的 fn。
  • @shirgill_ansari 每个js函数都可以作为构造函数
猜你喜欢
  • 2017-04-18
  • 1970-01-01
  • 2016-09-07
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 2015-05-26
相关资源
最近更新 更多