Angular工厂“不是构造函数”

时间:2017-07-31 23:00:12

标签: angularjs factory

我正在尝试创建一个工厂,但是实例化它时出错了。我错过了什么吗?

  

sessionFactory不是构造函数

     

在新的sessionController(sessionController.js:5)

控制器

angular.module('app').controller('sessionController', ['sessionService', 'sessionFactory', sessionController]);

function sessionController(sessionService, sessionFactory) {
    var vm = this;
    var mySessionFactory = new sessionFactory();
}

工厂

angular.module('app').factory('sessionFactory', ['$window', sessionFactory]);
function sessionFactory($window) {
    return {
        save: save,
        get: get,
        clear: clear
    }

    function save(key, value) {
        $window.sessionStorage.setItem(key, value);
    }

    function get(key) {
        return $window.sessionStorage.getItem(key);
    }

    function clear() {
        $window.sessionStorage.clear();
    }
}

HTML

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
<script src="./app/app.js"></script>
<script src="./app/sessionController.js"></script>
<script src="./app/sessionService.js"></script>
<script src="./app/sessionFactory.js"></script>

4 个答案:

答案 0 :(得分:2)

Angular调用以下工厂函数一次以获得用于注入的单例:

function sessionFactory($window) {
    return {
        save: save,
        get: get,
        clear: clear
    }

    // ...
}

所以你在这个对象上调用new

{
    save: save,
    get: get,
    clear: clear
}

由于您已拥有所需的对象,因此无需致电new

答案 1 :(得分:1)

以下是此行的问题

/etc/chef/client.rb

您不必实例化它只是直接使用它,因为它已经实例化。

答案 2 :(得分:1)

如果要创建工厂实例,则应返回如下函数 -

angular.module('foo', [])
.factory('Foo', ['$http', function($http) {
  return function() {
    this.x = "Some";
    this.y = "value";

    this.someFunction = function() {
      return this.x + this.y;
    };
  };
}]);

然后你可以使用 -

实例化它
var factoryObj = new Foo();

如果您返回object而不是(构造函数)function,则无需使用new实例化对象。您可以直接使用sessionFactory

答案 3 :(得分:0)

您可以使用新的sessionFactory(),sessionFactory必须返回一个函数而不是一个要用作构造函数的对象。 因此,您可以返回一个匿名函数,该函数将返回一个对象。

 function sessionFactory($window){

    function save(key, value) {
        $window.sessionStorage.setItem(key, value);
    }

    function get(key) {
        return $window.sessionStorage.getItem(key);
    }  

    function clear() {
        $window.sessionStorage.clear();
    }
    return function () {
        return {
            save : save,
            get : get,
            clear : clear
        }
    }
}

此实现可以正常工作。