【问题标题】:Angular factory "is not a constructor"Angular 工厂“不是构造函数”
【发布时间】:2017-07-31 23:00:12
【问题描述】:

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

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>

【问题讨论】:

    标签: angularjs factory


    【解决方案1】:

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

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

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

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

    您不必调用new,因为您已经拥有所需的对象。

    【讨论】:

      【解决方案2】:

      这是这条线的问题

       var mySessionFactory = new sessionFactory();
      

      你不必实例化它直接使用它,因为它已经实例化了。

      【讨论】:

        【解决方案3】:

        如果你想创建一个工厂的实例,你应该返回一个函数如下 -

        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

        【讨论】:

          【解决方案4】:

          您可以使用新的 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
                  }
              }
          }
          

          这个实现可以正常工作。

          【讨论】:

            猜你喜欢
            • 2014-02-18
            • 2012-01-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-03
            • 1970-01-01
            • 2014-07-13
            • 1970-01-01
            相关资源
            最近更新 更多