这是我目前正常运作的代码:
angular.module('myApp')
.controller('myCtrl', function (DocumentTypeManagerPdf, DocumentTypeManagerVideo) {
$scope.showPreview = function(document){
var previewModule = eval('DocumentTypeManager' + document.clientModule);
previewModule.show(document);
};
});
但......我会避免两件事:
在那里有更好的解决方案,可以动态使用工厂吗?
答案 0 :(得分:2)
我认为你应该采用工厂模式。
一个服务DocumentTypeManagerFactory
使用一种方法,如
var myDocumentTypeManager = DocumentTypeManagerFactory.instanciateWithType(document.clientModule);
myDocumentTypeManager.show(document);
您的控制器只会注入一个服务(而DocumentTypeManagerFactory应该全部注入)
在DocumentTypeManagerFactory中,您应该进行切换,或者if / else以避免使用eval。
答案 1 :(得分:1)
我认为你可以在函数中使用arguments
。 inJS每个函数都有一个名为arguments的变量,它是给定参数的数组。
但我不确定你的DocumentTypeManagerXYZ
对象的结构如何。因此,只需键入控制器功能的debugger;
开头,然后通过控制台检查arguments
数据,即可采取正确的操作。
以下是我想到的第一个;
var previewModule;
for(var i = 0, len=arguments.lengh; i <len; i++) {
if (arguments[i].constructure.name === 'DocumentTypeManager' + document.clientModule) {
previewModule = arguments[i];
break;
}
}
这将是您的基本方法。
因为这是一个角度应用程序,您可以使用$injector.get("moduleName")
;
var previewModule = $injector.get("'DocumentTypeManager' + document.clientModule");
请参阅$injector