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。使用常量而不是服务是有效的,除非您有依赖项!