1

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

有关系吗?一个会比另一个更好吗?我相信常量应该在其他提供者之前加载,对吗?

4

2 回答 2

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(...);
});

我不知道这是否是最好方法,但它有效,我没有其他反对意见,所以对我来说没问题。

于 2013-10-17T13:28:46.013 回答
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 来证明您正在创建您的类型的实例,而不仅仅是一些随机对象。

我想说这种方法确实使您说您不想要的类型为“全球”。为什么不受欢迎?

如果要共享该类型的单个实例;如this answer中所述,我一直在使用Angular工厂,但是我从未尝试在多个模块之间共享单个实例。

于 2013-10-17T13:21:58.430 回答