工厂没有注入依赖

时间:2015-01-14 13:47:54

标签: angularjs

这是我目前正常运作的代码:

angular.module('myApp')
  .controller('myCtrl', function (DocumentTypeManagerPdf, DocumentTypeManagerVideo) {

    $scope.showPreview = function(document){
      var previewModule = eval('DocumentTypeManager' + document.clientModule);
      previewModule.show(document);
    };

  });

但......我会避免两件事:

  1. Eval是邪恶的
  2. 我被迫注入我将实施的每个DocumentTypeManagerXYZ
  3. 在那里有更好的解决方案,可以动态使用工厂吗?

2 个答案:

答案 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