Angular:多个文件中的单个服务

时间:2015-04-16 13:48:12

标签: angularjs

我有一个为我创建课程的单身人士。每个类都在一个单独的文件中。

// singleton.js

angular.module('mymodule')
  .service('singleton', SingletonClass)

// someclass1.js, someclass2.js, ...
// Multiple files with same layout. Each web page has different # of these files.
// Therefore, it's hard to inject them statically
// (ie, via aggregator service/factory).

angular.module('mymodule')
  .??('someClass', function(singleton) {
    classOptions = {}; // details here
    // creates a class with options and adds it to `singleton`s cache
    singleton.addClass(classOptions);

  })

// yet another file

angular.module('mymodule')
  .controller('myController', function(singleton) {
    singleton.getClasses(); // gets all classes added by #addClass method
  });

基本上,我希望每个单独的“类”都可以自己包含在自己的文件中,类似于模块的自包含。这意味着我不希望想要singleton或任何聚合器服务/工厂知道这些类在其创建中是否存在。

修改

我想澄清一下:我正在使用singleton而不是单独注入创建的类,因为我还不知道将创建哪些类。该网页将动态加载某些js文件。每个文件都将注入单例对象并使用addClass方法创建一个新类并将其存储在singleton对象本身中。使用singleton.getClasses()的控制器不会知道它有多少或哪些类,但它们有一个统一的接口,允许它以可预测的方式使用它们。

1 个答案:

答案 0 :(得分:1)

你可以尝试为每个课程设置提供者(根据我上面的评论),尽管看起来如此。 。 。耗时的。也许你只是不需要它?使每个类成为闭包中的单独文件(就像你需要使用jquery一样),并从注入器中获取单例对象:

// file 1 - Add other files for other classes.
;(function(window, $) {
  $(function() {
    var classOptions = {};
    $('body').injector().get('singleton').addClass(classOptions);
  });
})(window, jQuery);

这不完全是棱角分明的方式,角度纯粹主义者会呼唤你的头脑,但我认为如果你不想让提供者感到困惑,它会实现你所追求的目标。