Javascript 创建可注入类(构造函数)
我是一名AngularJS新手,我刚刚开始理解Javascript 创建可注入类(构造函数),javascript,angularjs,Javascript,Angularjs,我是一名AngularJS新手,我刚刚开始理解工厂、服务和控制器的概念和区别。据我所知,工厂用于返回可以注入的“值对象”。我见过的大多数例子都是这样的: angular.module('module.factories', function() { factory('FactoryObject', function() { return { someFunction: function(someParam) {}; some
工厂
、服务
和控制器
的概念和区别。据我所知,工厂
用于返回可以注入的“值对象”。我见过的大多数例子都是这样的:
angular.module('module.factories', function() {
factory('FactoryObject', function() {
return {
someFunction: function(someParam) {};
someOtherFunction: function(someOtherParam) {});
};
});
});
在我的控制器中
,我希望能够使用此对象,但我希望在控制器中初始化/实例化它,因为它可以根据控制器中的事件/操作重新初始化。因此,我想知道是否可以在工厂中返回构造函数
angular.module('module.factories', function() {
factory('FactoryObject', function() {
function FactoryObject(initParam) {
}
FactoryObject.prototype.someFunction = function() {};
return FactoryObject;
});
});
这是一个适合角工厂的模式吗?或者对这样的自定义对象使用工厂只是“矫枉过正”?我应该把它包含在一个库js文件中,然后从那里引用它吗?把它放在工厂里的一个好处是,在测试中很容易模拟它,因为它将在使用的地方注入。有没有其他可以替代的角度机构?我也有同样的问题。以下是我实施的内容:
angular.module('foo', [])
.factory('Foo', ['$http', function($http) {
return function(a, b) {
this.arr = [];
this.a = a;
this.b = b;
this.random = Math.floor(Math.random()*11);
this.someFunc = function(c) {
this.arr.push(c);
};
};
}]);
现在,我可以做:
var f1 = new Foo('A', 'B');
f1.random; // i.e. 0
f1.someFunc('z'); // only affects f1.arr
var f2 = new Foo('C', 'D');
f2.random; // i.e. 8
f2.someFunc('y'); // only affects f2.arr
使事情更加模块化。希望能有帮助。我也有同样的问题。我发现了一篇关于如何设置面向对象AngularJS服务的精彩文章。请注意有关使用工厂而非服务的说明。它还包括扩展对象。我发现它非常容易设置,并且它与Angular完美匹配,同时保持Javascript简单明了
对于单例且不需要实例化的工厂服务,我使用对象文字方法,它具有一些性能优势。你说得很对,这是创建可注入“类”(构造函数)的方法。但是,只有在需要注入类使用的其他内容时,才需要使用
factory
:
.factory('Class', ['$q', function ($q) {
function Class () {}
Class.prototype = {
constructor: Class,
doSomeAsyncAction: function () {
return $q(function (resolve, reject) {
// ...
});
},
// ...
};
return Class;
})
如果您要创建一个完全独立的类(例如某些数据结构),则可以使用常量
,这样即使在服务提供商中也可以使用您的类:
(function (undefined) {
function Class () {}
Class.prototype = { ... };
angular.module(...)
.constant('Class', Class);
})();
作为旁注,使用
提供程序
在这方面对您没有帮助。提供者服务于完全不同的目的,并且(除其他外)返回一个工厂函数,然后在第一次请求注入时使用该函数创建服务的单个实例。提供者用于让您在应用程序构建的_configphase uu()中配置单个服务实例。以下是我解决问题的方法:
(function (myModule) {
'use strict';
myModule.service('myService', [
function() {
var serivce = this;
var obj = null;
service.func1 = function(a, b) {
}
service.func2 = function(c, d) {
. . .
return something;
}
var constructor = function(myObj) {
obj = myObj;
return service;
}
return constructor;
}
]);
}(angular.module("myModule")))
(function(myModule) {
'use strict';
myModule.controller('myController', [
'$scope', 'myService', function($scope, myService) {
var service = myService($scope.someObj);
$scope.someOtherObj = service.func2($scope.a, $scope.b);
}
]);
}(angular.module("myModule")))
从服务返回的唯一内容是构造函数,然后服务返回服务的其余部分。我认为在提供函数中声明自定义factory对象的关键在于它从应用程序的其余部分抽象出来。如果您确实需要构造函数,那你现在做的很好@ganaraj我之所以“需要”它,是因为它可能在控制器的生命周期内在控制器中多次重新初始化。我可以只返回一个常规对象,然后在其上有一个
init
方法,但我不认为这样会更好。感谢您的反馈。如果您正在寻找要重新初始化的相同对象,那么传递构造函数将不是一个解决方案。如果您希望能够创建多个类型的对象(构造函数),那么这将是正确的解决方案。@ganaraj不,我实际上在寻找新实例,所以我在控制器中使用new FactoryObject(initParam)
。另一个例子是我本来可以解决它的。我们光荣地战斗。。。我现在将倒在我自己的剑上。