Angularjs 如何在模块之间共享自定义数据类型?
在我的项目中,我创建了一个自定义类型,Angularjs 如何在模块之间共享自定义数据类型?,angularjs,model,Angularjs,Model,在我的项目中,我创建了一个自定义类型,MyType。我想在多个角度模块中使用它,但我不确定正确的方法。我最初的猜测是创建一个公开自定义类型的服务,但这似乎有点过于复杂。我有我的演示代码的方法下面和一个现场演示可以在网站上找到 有更好的办法吗?我希望将内容包含在模块中,因此我不希望将自定义类型公开为全局类型 定义具有自定义类型的服务: //this code is in file myproject.js (function(angular, undefined) { //custom typ
MyType
。我想在多个角度模块中使用它,但我不确定正确的方法。我最初的猜测是创建一个公开自定义类型的服务,但这似乎有点过于复杂。我有我的演示代码的方法下面和一个现场演示可以在网站上找到
有更好的办法吗?我希望将内容包含在模块中,因此我不希望将自定义类型公开为全局类型
定义具有自定义类型的服务:
//this code is in file myproject.js
(function(angular, undefined) {
//custom type
function MyType(name) {
this.name = name;
}
MyType.prototype.toString = function(){
return '[MyType ' + this.name+ ']';
};
angular.module('myproject', [])
.service('myProjectService', function() {
//hack to expose MyType
this.MyType = MyType
});
}(angular));
第一控制器:
//this code is in file modulea.js
(function(angular, undefined) {
angular.module('myproject.modulea', ['myproject'])
.controller('ControllerA', function($scope,myProjectService) {
var MyType = myProjectService.MyType,
myInstance = new MyType('in controller a');
$scope.myInstance = myInstance;
});
}(angular));
//this code is in file moduleb.js
(function(angular, undefined) {
angular.module('myproject.moduleb', ['myproject'])
.controller('ControllerB', function($scope,myProjectService) {
var MyType = myProjectService.MyType,
myInstance = new MyType('in controller b');
$scope.myInstance = myInstance;
});
}(angular));
第二控制器:
//this code is in file modulea.js
(function(angular, undefined) {
angular.module('myproject.modulea', ['myproject'])
.controller('ControllerA', function($scope,myProjectService) {
var MyType = myProjectService.MyType,
myInstance = new MyType('in controller a');
$scope.myInstance = myInstance;
});
}(angular));
//this code is in file moduleb.js
(function(angular, undefined) {
angular.module('myproject.moduleb', ['myproject'])
.controller('ControllerB', function($scope,myProjectService) {
var MyType = myProjectService.MyType,
myInstance = new MyType('in controller b');
$scope.myInstance = myInstance;
});
}(angular));
更新:
我创建了一个使用常量而不是服务的:
angular.module('myproject', [])
.constant('myProjectsModel', {MyType:MyType});
}(angular));
这有关系吗?一个比另一个好吗?我相信常量应该在其他提供者之前加载,对吗?共享一个类型;我一直在这样做: 首先,创建一个类型为的JavaScript文件;MyType.js:
MyType = function MyType() {
someInstanceVariable : "some default value";
// whatever else you need in here
}
将该文件“导入”到HTML中:
<script src="MyType.js"></script>
您可以使用console.log来证明您正在创建类型的实例,而不仅仅是一些随机对象
我要说的是,这种方法确实使您说不想要的类型成为“全局”。为什么这是不可取的
如果要共享该类型的单个实例;如前所述,我一直在使用Angular factory,但我从未尝试在多个模块之间共享一个实例。我们目前正在使用类似的工具,但服务是构造函数:
app.service("MyType", function() {
function MyType(name) { ... }
MyType.prototype.toString = function() { ... };
// etc
return MyType;
});
app.controller("ControllerA", function($scope, MyType) {
// use MyType (the service which is actually the constructor) directly
var x = new MyType(...);
});
我不知道这是否是最好的方法,但它是有效的,我没有其他反对意见,所以对我来说没问题。我绝对不喜欢这种方法。这会将您的
MyType
类留在全局命名空间中,并且不允许任何依赖项检查或模块化测试@Nikos的答案更“棱角分明”。@tennisgent它确实将MyType保留在全局名称空间中;但我不明白你为什么认为那是件坏事。在这里你可以随意叫我笨蛋。您正在执行哪种类型的依赖项检查?何时执行?它如何防止模块化测试?制作独立于角度框架的类型不是更好吗;或者我从其他不应该应用于JavaScript的语言中获取概念?通常在进行单元测试时进行依赖性检查。为了测试ControllerB
模块,您不能轻松地“模拟”MyType
类。通过将其转换为服务,它允许您在单元测试中模拟此提供程序,然后您可以专注于测试ControllerB
代码,100%独立于可用的任何其他类/文件。如果MyType
是全局的,那么进行模拟就更加困难。在这里,角度工厂也很有可能。这将预先实例化MyType对象,并为您提供一个实例,而不仅仅是类,但我不确定@pgreen2的问题中更喜欢哪个。如果我从OP代码的这一部分判断得很好:myInstance=newmytype('in controller b')代码>,pgreen2也在创建许多实例。如果你想要一个单身汉的话,工厂法确实是一种选择。@NikosParaskevopoulos,你肯定在证实我的想法。我考虑了您的方法,但我选择不将服务作为构造函数,因为我不想为每个自定义类型创建新的服务。通过将其作为服务的属性,我可以将多个自定义类型按单个服务分组。我应该说得更清楚。用常量代替服务怎么样?@pgreen2“…每个自定义类型都有新的服务”:是的,这是合理的。我们不介意有更多的服务,在某些地方,我们甚至返回其他类作为主类的静态成员(参见Java世界中的公共内部类)。我的意思是:函数MyType(){…}函数MyOtherType(){…}MyType.MyOtherType=MyOtherType;返回MyType代码>。使用常量而不是服务是有效的,除非您有依赖项!