【问题标题】:Creating Custom Objects in AngularJS在 AngularJS 中创建自定义对象
【发布时间】:2016-12-15 15:33:08
【问题描述】:

我想在 AngularJS 中实现我自己的自定义对象/类。但是,我被困在使用工厂/服务作为自定义对象的概念上——我知道工厂和服务是用来提供应用程序的业务逻辑的,但是我可以在一个应用程序中创建多个工厂和服务吗?如果是这样,“单例”一词(我读过的许多文章都将服务描述为)究竟意味着什么?

例如,这是否是在 AngularJS 中创建一个填充有学生对象的基本学校对象的有效和/或首选方法?

app.factory('schoolService',function(student){
    var school = {};
    school.students = [];
    school.addStudent = function(){
         var newStudent = new student();
         this.students.push(newStudent);
    }
    return school;
}
app.service('student',function(){
     //anyway to toss in a constructor here?
     this.name = 'name';
     this.getName = function(){
         return this.name;
     }
}
app.controller('schoolCtrl',function(schoolService){
     schoolService.addStudent(); //obviously normally wouldn't do this, but for demonstration purposes
     $scope.students = schoolService.students;
     //expect $scope.students to equal an array of length 1, with one student object
}

在此先感谢,对于所有嵌套问题,我们深表歉意!

【问题讨论】:

    标签: angularjs angularjs-service angularjs-factory


    【解决方案1】:

    事实上,当你在控制器中注入 service 时,服务对象已经被实例化了,因为 Angular 在内部已经在你的服务构造器上调用了 new。 (记住.service() 只是一个构造函数)

    您可以使用.service.factory 有两个不同的原因。是的,它们都是单例,但.factory 可以产生多个实例。

    “这就是工厂所做的,它们以您希望的方式创建新对象。”

    使用.factory,它会返回任何你想要的东西。下面,工厂返回一个构造函数。 Angular 只是缓存你返回的内容以供重复使用。

    function PersonService() {
      function Person() {
        this.foo = function () {
    
        };
      }
      Person.prototype.bar = function () {
    
      };
      return Person;
    }
    angular
      .module('app')
      .factory('PersonService', PersonService);
    

    然后在某个控制器中:

    function PersonController(PersonService) {
      // new instance!
      var newPerson = new PersonService();
      console.log(newPerson);
    }
    

    " [...] .service() 本质上是 .factory() 调用的“最终结果”。.service() 通过在函数上调用 new 为我们提供返回值,它可以是限制性的,而 .factory() 是在此编译过程之前的一步,因为我们可以选择要实现和返回的模式。”

    参考号:https://toddmotto.com/factory-versus-service

    【讨论】:

      【解决方案2】:
      您提到的

      服务/工厂用作逻辑容器。它们可以创建一次并注入多个控制器以执行业务逻辑。这有助于代码的可重用性和逻辑抽象。

      'Singleton' 是定义什么是服务的正确方法。它们在应用程序被引导时被初始化一次。一般来说,您可以将服务用作“getter 和 setter”。如果你熟悉编码,你一定知道它的含义。

      而且,就您的示例而言,不,服务不会像您想要的那样用于创建对象。要在 Javascript 中创建新对象,您可以遵循以下方法

      var Student = function(name){
         this.name = name;
      };
      
      var roy = new Student('Roy');
      

      希望这能回答您的问题。 您可以在Blog 中阅读有关服务/工厂的更多信息

      【讨论】:

      • 感谢 Akhil 的回复!所以我打算创建的对象是相当大的,理想情况下想把它写在我的工厂外面。我会简单地在应用程序之外定义对象,并将其作为依赖项传递吗?谢谢!
      【解决方案3】:

      单身人士保持静止。控制器在调用时加载。您可以将学生存储在服务中,因为它会在您的应用程序的整个生命周期中持续存在,并且可以在控制器之间共享。

      https://jsfiddle.net/jtgd6tjn/

      角度

      function AppCtrl($scope, SchoolService) {
        $scope.students = SchoolService.students;
        $scope.addStudent = function() {
          SchoolService.students.push($scope.newStudent);
          $scope.newStudent = {};
        }
      }
      
      function SchoolService() {
        var service = {
          students: []
        };
        return service;
      }
      

      HTML

      <div ng-app="myApp" ng-controller="AppCtrl">
        <form ng-submit="addStudent()">
          <input type="text" ng-model="newStudent.first">
          <br>
          <input type="text" ng-model="newStudent.last">
          <br>
          <button type="submit">
            Add New Student
          </button>
        </form>
        <hr>
        <ul>
          <li ng-repeat="student in students"> {{ student.first}} {{ student.last }} </li>
        </ul>
      </div>
      

      【讨论】:

      • 感谢 Rob 的回复,但我将在哪里定义学生对象,以及如何将其注入服务?它会像用学生对象定义一个 var 并使用函数 SchoolService(student) 一样简单吗?谢谢!
      • 你说的是新学生吗?
      • 种类 - 理想情况下,我想让学生成为一个有自己的功能、数据等的课程,以避免工厂混乱。因此,例如,$scope.students 和 SchoolService.students 将是来自学生班级的学生对象数组。我知道您的示例可以用于此目的,但我目前正在使用的应用程序要复杂得多,并且我需要存储大量计算和数据,这些计算和数据并非直接来自用户输入。
      • 嗯,服务是为与学生相关的任何功能而设计的。您可以根据需要将其复杂化,或者创建更小的工厂并根据需要将它们注入到其他工厂和控制器中。老实说,我从来没有在 Angular 中使用过类本身,只是依赖于服务并且没有遇到任何问题。您可能需要在网上更深入地了解如何在 Angular 中使用类。尽管这个 url 是一个风格指南,但它确实很好地概述了构建 Angular 应用程序的责任:github.com/johnpapa/angular-styleguide/blob/master/a1/README.md
      • 当然。不确定你的编程背景是什么,但 Angular 是另一种动物。以一种好的方式。只是学习曲线有点陡峭。
      猜你喜欢
      • 2020-06-28
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      相关资源
      最近更新 更多