如何在模块之间共享自定义数据类型?

时间:2013-10-17 12:59:34

标签: angularjs model

在我的项目中,我创建了一个自定义类型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));

重要吗?一个人会更好吗?我相信常量应该在其他提供者之前加载,这是正确的吗?

2 个答案:

答案 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所述,但我从未试图在多个模块之间共享单个实例。