是的,这是可能的。通过对Web Worker环境的一些攻击,您可以在Web Worker中运行Angular,并在前台和工作者Angular应用程序中使用一个模块。这个答案需要和延伸,从another of my answers regarding unit testing
代码在主应用程序,在工厂/服务,你可以有类似
var worker = new $window.Worker('worker.js');
然后在worker.js
,你可以修改全局范围足以让角加载:
// Angular needs a global window object
self.window = self;
// Skeleton properties to get Angular to load and bootstrap.
self.history = {};
self.document = {
readyState: 'complete',
querySelector: function() {},
createElement: function() {
return {
pathname: '',
setAttribute: function() {}
}
}
};
// Load Angular: must be on same domain as this script
self.importScripts('angular.js');
// Put angular on global scope
self.angular = window.angular;
// Standard angular module definitions
self.importScripts('worker-app.js');
self.importScripts('shared-module.js');
// No root element seems to work fine
self.angular.bootstrap(null, ['worker-app']);
而且你可以定义shared-module
就像任何其他:
angular.module('shared-module', [])
.factory('SharedFactory', function() {
return {
myFunc: function() {
return 'some-data';
}
};
});
在worker-app.js
,可以定义主应用程序,使用所述共享模块
var workerApp = angular.module('worker-app', ['shared-module']);
注入共享的组件,例如,到run
回调工人应用程式。
workerApp.run(function(SharedFactory, $window) {
$window.onmessage = function(e) {
var workerResult = SharedFactory.myFunc();
$window.postMessage(workerResult);
};
});
在前台角的应用程序,你可以通过常用的脚本标签包括shared-module.js
,并使用依赖注入来访问它的组件和往常一样
var foregroundApp = angular.module('forground-app', ['shared-module']);
foregroundApp.controller(function(SharedFactory, $scope) {
// Use SharedFactory as needed
});
要确认的shared-module
的情况下,在前台和工作应用程序是不同的。
你能澄清一下,如果通过“相同的服务”你是指在同一个服务中可用的相同代码或实际上相同的内存中实例? – 2015-01-12 09:09:49
我的意思是相同的代码可用... – Brett 2015-01-13 12:10:06