在AngularJS中创建自定义对象

时间:2016-08-09 14:15:13

标签: angularjs angularjs-service angularjs-factory

我想在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
}

提前致谢,对所有嵌套问题感到抱歉!

3 个答案:

答案 0 :(得分:1)

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

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>

答案 1 :(得分: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);
}

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

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

答案 2 :(得分:0)

您提到的

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

&#39;的 的Singleton &#39;是定义服务的正确方法。它们在应用程序被引导时初始化一次。一般而言,您可以将服务用作&#39; getter和setter &#39;。如果您熟悉编码,则必须知道它的含义。

并且,就你的例子而言,没有提到服务不会像你想要的那样创建对象。要在Javascript中创建新对象,您可以按照以下方法

getInfo (id) {
    return db.main('events').where('id', id).select()
    .then(result => {
        if (result.length == 0) {
            // you can also just throw your error object thing,
            // but standard Error are generally the convention
            throw new Error('Event does not exist')
        }

        const [event] = result

        event.status = this.getStatus(id)
        event.content = this.getContent(id)
        event.price = this.getPrice(id)

        return Promise.all([this.getUsers(id), this.getHosts(id)])
        .then(([users, hosts]) => {
            event.users = users
            event.hosts = hosts

            // this is the only value that
            // this.getInfo(id).then(value => {/* ... */}) will see
            return event
        }
    })
}

希望这能回答你的问题。 您可以在此Blog

中详细了解服务/工厂