Angularjs:实现与工厂相同的服务结构

Angularjs: Achieve Same Structure for Service as Factory

我正在玩 angularjs servicesfactories。我创建了一个名为 BookFactory 的工厂,如下所示:

// Code goes here

app
  .factory('BootFactory', function() {
    var bookFactory;

    function add() {

    }

    function remove() {

    }

    function getAll() {

    }
    bookFactory = {
      add: add,
      remove: remove,
      getAll: getAll
    }
    return bookFactory;

  });

还有一个BookService如下:

app.service('BookService', function() {

        var bookService;

        function add() {

        }

        function remove() {

        }

        function getAll() {

        }

        /*
        It throws:
        Uncaught ReferenceError: Invalid left-hand side in assignment.

        How can I achieve the same structure with the services which I have used in factories.

        this = {
          add: add,
          remove: remove,
          getAll: getAll
        };

        */

        //Do I have to add all methods like this
        this.add=add;
        this.remove=remove;
        this.getAll=getgAll;

        //Or there's any other better way to achieve it

      });

我想做的是保持结构一致,即我希望工厂和服务都像这样:

bookFactory = {
          add: add,
          remove: remove,
          getAll: getAll
        }

在工厂的情况下,它工作正常。但是在服务的情况下我不能这样做。因为服务与 this 一起工作,我不能这样做:

/*
            It throws:
            Uncaught ReferenceError: Invalid left-hand side in assignment.

            How can I achieve the same structure with the services which I have used in factories.

            this = {
              add: add,
              remove: remove,
              getAll: getAll
            };

            */

我想做的是:

//Do I have to add all methods like this
            this.add=add;
            this.remove=remove;
            this.getAll=getgAll;

            //Or there's any other better way to achieve it

有没有更好的方法呢?这是 plunkr

您可以像这样创建 bookService -

app.service('BookService', function() {
    return {
          add:add,
          remove:remove,
          getAll:getAll
        };

    function add() {

        }

        function remove() {

        }

        function getAll() {

        }

  });

你可以这样做:

app.service('BookService', function() {
    function add() {

    }

    function remove() {

    }

    function getAll() {

    }

    var bookService = {
      add: add,
      remove: remove,
      getAll: getAll
    };

    return bookService;
  });

Angular 并不关心您的服务 return。工厂 vs 服务只是关于它如何被调用,工厂是这样调用的:factory() 和服务是这样的:new service()。在 JS 中,构造函数可以return任何你想要的东西。

工厂和服务只是创建服务对象实例的两种略有不同的方式。

工厂函数return实例本身。

服务函数是一个构造函数,与 new(或类似的东西)一起使用来创建实例。 JS中的构造函数可以return直接实例化的对象实例(而不是默认的thisread more)。

这应该让你这样做:

  .service('BookService', function() {
    var bookService;

    function add() {}

    function remove() {}

    function getAll() {}

    bookService = {
      add: add,
      remove: remove,
      getAll: getAll
    }
    return bookService;
  })

所以是的,factoryservice 可以以完全相同的方式运行,因为这个 JS 怪癖。

我真的不知道你为什么要对两者使用相同的配方,因为从语义上讲它们做的是相同的,为什么不在这种情况下使用特定服务创建所有服务呢?