2017-07-31 49 views
0

我想创建一个工厂,但得到一个错误实例化它。我错过了什么吗?角度工厂“不是一个构造函数”

的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> 

回答

2

角调用下面的工厂函数一旦得到用于注射单:

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

    // ... 
} 

所以你调用这个对象上new

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

因为您已经拥有所需的对象,所以您不必呼叫new

+0

谢谢!那就是诀窍。 –

1

下面是这条线

var mySessionFactory = new sessionFactory(); 

你不必实例化,它只是直接用它,因为它已经实例化的问题。

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

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 
     } 
    } 
} 

此实现将正常工作。