保持 angularjs 与应用程序分离

Keeping angularjs decoupled from an application

我正在计划一个理想情况下我想与 Angular 保持分离的应用程序,因此所有 dom 交互都将进入 Angular 层,但核心业务逻辑将保存在完全不知道 Angular 的独立应用程序中。两者将通过 Angular 能够向核心应用程序发送消息的服务进行通信。

独立应用很可能会使用 requirejs 来处理依赖项注入。

我不确定的是如何获得一个可以这样声明的模块:

define('AppInteractor', ['require'], function(requre){
    // Set up interactor functionality
});

进入 Angular 服务。

我的第一个想法是使用这样的适配器:

define(['AppInteractor', 'angular'], function(interactor, angular) {
    var app = angular.module('appInteractor', []).service('AppInteractor', interactor);
});

这会在 angular 模块中将 AppInteractor 注册为服务,这种方法的问题似乎是因为 requirejs 异步加载东西,所以当 angular代码运行。它似乎也以 angular 加载两次而告终,这大概也无济于事。

我看过几篇文章介绍了通过 require 加载所有 Angular 组件,但我希望有更简单的方法来完成这项工作。

任何人都可以推荐我如何完成这项工作吗?

如果你打算在主要模块初始化后添加服务,我建议你将它添加到你的应用程序模块

define(['AppInteractor', 'angular'], function(interactor, angular) {
  // There is no second parameter, because we are getting an existing
  // module, not creating a new one.
  var app = angular.module('appModule');
  app.service('AppInteractor', interactor);
});

否则,如果您想将所有其他逻辑分组到不同的模块中,则需要导入该模块并将其添加为应用程序模块的要求。

define(['AppInteractorModule', 'angular'], function(interactorModule, angular) {
  var app = angular.module('appModule', [interactorModule.name]);
});

我也推荐大家使用ES6(6to5,traceur),browserify或者Typescript之类的工具进行模块管理,然后编译成AMD。我发现开发起来更容易、更干净。