在angular中使用字符串变量的Javascript构造函数

在angular中使用字符串变量的Javascript构造函数,javascript,angularjs,webpack,Javascript,Angularjs,Webpack,我有一个小angular(v1.5.11)应用程序,我试图从字符串变量实例化一个对象。这段代码以前在我的旧设置中工作,但在从bower/gulp更改为webpack(3.8.1)后,我现在得到以下错误。我不确定这是由我新的导入语句还是什么引起的 一个类似的问题()讨论了这个问题,但是在我的示例中,我没有得到任何解决方案,这就是为什么我认为可能是导入还是pojo结构本身的原因 错误: TypeError: $window[iteratorType] is not a constructor 代码

我有一个小angular(v1.5.11)应用程序,我试图从字符串变量实例化一个对象。这段代码以前在我的旧设置中工作,但在从bower/gulp更改为webpack(3.8.1)后,我现在得到以下错误。我不确定这是由我新的导入语句还是什么引起的

一个类似的问题()讨论了这个问题,但是在我的示例中,我没有得到任何解决方案,这就是为什么我认为可能是导入还是pojo结构本身的原因

错误:

TypeError: $window[iteratorType] is not a constructor
代码:

MyService.js


如果您不想更改任何代码,您可以告诉webpack提供您的服务。这将使其在窗口范围内可用:

rules: [{
    test: require.resolve('./util/listiterator.pojo.js'), //the correct absolute path
    use: [{
        loader: 'expose-loader',
        options: 'ListIterator'
      }
    ]
  }
]
这在您的示例中未经测试,但在我的Highcharts和AngularJS设置中效果良好

编辑


当然,您必须安装
npmi-D expose loader

如果您不想更改任何代码,您可以告诉webpack提供您的服务。这将使其在窗口范围内可用:

rules: [{
    test: require.resolve('./util/listiterator.pojo.js'), //the correct absolute path
    use: [{
        loader: 'expose-loader',
        options: 'ListIterator'
      }
    ]
  }
]
这在您的示例中未经测试,但在我的Highcharts和AngularJS设置中效果良好

编辑

当然,您必须安装
npmi-D expose loader

这是一种有角度的方式:

app.factory('F1', function() {...})
app.factory('F2', function() {...})
app.factory('F3', function() {...})

app.factory('MyService', function($injector) {
  var name = 'F1';
  var someFactory = $injector.get(name);
})
这是一种有角度的方式:

app.factory('F1', function() {...})
app.factory('F2', function() {...})
app.factory('F3', function() {...})

app.factory('MyService', function($injector) {
  var name = 'F1';
  var someFactory = $injector.get(name);
})

您正在导入
MyService
文件中的
ListIterator
类。你为什么不直接使用这个
ListIterator
类呢?我添加了一个编辑,解释这个问题的答案没有帮助我解决问题。你以前使用过全局函数。然后转向进口。它在Windows上不再可用。您已经说过,
var iterator=new ListIterator()
可以正常工作。不清楚问题出在哪里。@estus这行代码:var iterator=new$window[iteratorType]();不起作用并产生上述错误。后面的一行只是表示该函数一般可用。您可以将需要在此处使用的函数公开为全局函数,如
window.ListIterator=ListIterator
(看起来不太好),也可以从全局函数切换到惯用的角度替代函数,正如其中一个答案所示,您正在
MyService
文件中导入
listicerator
类。你为什么不直接使用这个
ListIterator
类呢?我添加了一个编辑,解释这个问题的答案没有帮助我解决问题。你以前使用过全局函数。然后转向进口。它在Windows上不再可用。您已经说过,
var iterator=new ListIterator()
可以正常工作。不清楚问题出在哪里。@estus这行代码:var iterator=new$window[iteratorType]();不起作用并产生上述错误。后面的一行只是表示该函数一般可用。您可以将需要在此处使用的函数公开为全局函数,如
window.ListIterator=ListIterator
(看起来不太好),也可以从全局函数切换到惯用的角度替代函数,正如其中一个答案所建议的那样。我可以更改代码,这就是为什么我添加了import语句,该语句基本上应该对该服务执行相同的操作,只是在我看来更本地化。我可以更改代码,这就是为什么我添加了import语句,该语句基本上应该对该服务执行相同的操作,只是在我的应用程序中更本地化观点。我没有注入角度服务,但我喜欢使用全局范围内可用的javascript构造函数。我接受这一正确答案,因为这是重写代码的更好方式。我没有注入角度服务,但就像使用全局范围内可用的javascript构造函数一样,我接受这一正确答案,因为这是重写代码的更好方法。