【问题标题】:How exactly works this AngularJS factory example? Some doubts这个 AngularJS 工厂示例到底是如何工作的?一些疑问
【发布时间】:2016-03-18 12:21:48
【问题描述】:

我是 AngularJS 的新手,我正在学习它的教程。我对在 Angular 中使用 factory 有疑问。

我知道工厂是一种用于根据请求创建对象的模式。

所以在示例中有如下代码:

// Creates values or objects on demand
angular.module("myApp")     // Get the "myApp" module created into the root.js file (into this module is injected the "serviceModule" service
.value("testValue", "AngularJS Udemy")

// Define a factory named "courseFactory" in which is injected the testValue
.factory("courseFactory", function(testValue) {
    // The factory create a "courseFactory" JSON object;
    var courseFactory = {
            'courseName': testValue,    // Injected value
            'author': 'Tuna Tore',
             getCourse: function(){     // A function is a valid field of a JSON object
             alert('Course: ' + this.courseName);   // Also the call of another function
            }
          };    
    return courseFactory;       // Return the created JSON object
})

// Controller named "factoryController" in which is injected the $scope service and the "courseFactory" factory:
.controller("factoryController", function($scope, courseFactory) {
    alert(courseFactory.courseName);        // When the view is shown first show a popupr retrieving the courseName form the factory
    $scope.courseName = courseFactory.courseName;
    console.log(courseFactory.courseName);
    courseFactory.getCourse();  // Cause the second alert message
});

这是与 factoryController 控制器相关联的代码,位于 HTML 页面内:

<div  ng-controller="factoryController"> 
    {{ courseName }} 
</div> 

所以我很清楚:

  • factoryController 使用 courseFactory 工厂,因为它是被注入的

  • 当我打开页面时发生的第一件事是显示一条警告消息,因为它被称为:

    alert(courseFactory.courseName);
    
  • 然后将 courseFactory 的 **courseName 字段的值放入 $scope.courseName 属性(在 $scope 对象内) JSON 对象)。

这是我的第一个疑问。我知道工厂的定义是:

.factory("courseFactory", function(testValue)

我认为这意味着(如果我做错了断言,请纠正我)我的工厂被命名为 courseFactory 并且基本上是一个返回 courseFactory JSON 对象的函数。

所以这让我有些困惑(我来自 Java),因为在 Java 中我调用了一个工厂类,并且我获得了一个由工厂创建的对象的实例。但在这种情况下,在我看来,这样做:

$scope.courseName = courseFactory.courseName;

在我看来,courseName 是由 courseFactory JSON 对象直接检索的,而我没有使用 courseFactory

它究竟是如何工作的?为什么我不给工厂打电话? (或类似的东西)

【问题讨论】:

标签: javascript angularjs json javascript-framework angularjs-factory


【解决方案1】:

简单。

当你在 factory 语句中返回 courseFactory 对象时,控制器中注入的 courseFactory 就变成了 THAT 对象。因此,当您在控制器中执行$scope.courseName = courseFactory.courseName; 时,您实际上是在引用作为courseFactory 注入控制器的返回对象。所以你不需要getter,因为你的控制器中的 courseFactory 已经是对象了。您可以在控制器中执行console.log(courseFactory); 以查看 courseFactory 是什么。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    当 Angular 应用程序以给定的应用程序模块启动时, Angular 创建了一个新的注入器实例,而后者又创建了一个 配方注册表作为核心“ng”中定义的所有配方的联合 模块、应用程序模块及其依赖项。然后喷油器 当它需要创建一个对象时查询配方注册表 你的申请。

    参考。 https://docs.angularjs.org/guide/providers

    【讨论】:

      【解决方案3】:

      为了简化事情,有两种已知的方法可以创建在所有状态中都可用的函数(和方法)(将其视为在全局范围内创建函数),它们是工厂和服务。

      您可能想先阅读此内容Factory vs Service

      在我看来 courseName 是由 courseFactory JSON 对象,我没有使用 courseFactory。

      实际上这部分是正确的,因为 Angular 使用 DI 概念(依赖注入),你将不得不注入你的工厂(默认情况下返回一个对象,以及相应的函数作为属性),如果你不这样做;您将无法使用您的工厂对象方法。

      Angular 不是魔法,只是大多数人没有意识到 JavaScript 最基本的概念,特别是来自不同编程环境(如 C#、C++ 或 Java)的开发人员

      【讨论】:

      • 事实上我来这里是因为这个原因......因为我习惯于在纯 OO 范式中推理......我一直以简单的方式在 webapp 中使用 JavaScript\JQuery,现在我第一次使用深入研究 JavaScript 范式
      • 我建议你阅读 Cody Lindley 写的一本名为 JavaScript Succinctly 的书,这将使你的 JavaScript 之旅变得更加有趣和轻松......祝你好运:)。
      【解决方案4】:

      Factory 是一个单例服务。当您将工厂注入控制器或任何其他工厂时,您将获得您定义的确切 json 对象。每次调用它时它都不会创建任何新实例。工厂只初始化一次

      【讨论】:

        猜你喜欢
        • 2016-01-21
        • 1970-01-01
        • 2014-05-16
        • 1970-01-01
        • 2017-11-20
        • 1970-01-01
        • 1970-01-01
        • 2016-02-04
        • 1970-01-01
        相关资源
        最近更新 更多