在我的项目中,我创建了一个自定义类型MyType
。我想在多个角度模块中使用它,但我不确定这样做的正确方法。我最初的猜测是创建一个公开自定义类型的服务,但这看起来有点过于复杂。我有以下方法的演示代码,可以在http://jsfiddle.net/deafcheese/GS4tN/找到现场演示。
有更好的方法吗?我想保留模块中包含的东西,所以我不想将自定义类型公开为全局。
使用自定义类型定义服务:
//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));
更新: 我创建了使用常量而不是服务的http://jsfiddle.net/deafcheese/GS4tN/1/:
angular.module('myproject', [])
.constant('myProjectsModel', {MyType:MyType});
}(angular));
重要吗?一个人会更好吗?我相信常量应该在其他提供者之前加载,这是正确的吗?
答案 0 :(得分:2)
我们目前正在使用类似的东西,但服务 是构造函数:
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(...);
});
我不知道这是否是 最好的方式,但是它有效并且我没有其他反对意见,所以对我来说没问题。
答案 1 :(得分:0)
分享类型;我一直这样做:
首先,创建一个带有类型的JavaScript文件; MyType.js:
MyType = function MyType() {
someInstanceVariable : "some default value";
// whatever else you need in here
}
将该文件'导入'到您的HTML中:
<script src="MyType.js"></script>
然后可以在任何地方使用该自定义类型;无论是在AngularJS Controllre中还是在其他地方,您都可以这样做:
var myTypeInstance = new MyType();
console.log(myTypeInstance);
您可以使用console.log来证明您正在创建类型的实例,而不仅仅是一些随机对象。
我会说这种做法确实会使你说你不想要的“全球”类型。为什么这不受欢迎?
如果要共享该类型的单个实例;我一直在使用Angular工厂,如in this answer所述,但我从未试图在多个模块之间共享单个实例。