Angular2 IE11无法获取未定义或空引用的属性“应用”


69

将angular2软件包升级到以下版本后,出现以下错误:

  • @ angular / common“:” ^ 2.3.1
  • @ angular / compiler“:” ^ 2.3.1
  • @ angular / core“:” ^ 2.3.1
  • @ angular / forms“:” ^ 2.3.1
  • @ angular / http“:” ^ 2.3.1
  • @ angular / platform-b​​rowser“:” ^ 2.3.1“
  • @ angular / platform-b​​rowser-dynamic“:” ^ 2.3.1
  • @ angular / platform-server“:” ^ 2.3.1
  • @ angular / router“:” ^ 3.3.1

错误Unable to get property 'apply' of undefined or null reference

在此处输入图片说明

我在IE11中仅收到此错误,在Chrome中工作正常。

我做了一些挖掘,导致错误的行在angular / common模块中:

function combine(options) {
  return (_a = ((Object))).assign.apply(_a, [{}].concat(options));
  var _a;
}

打字稿文件:

@ angular / common / src / pipes / intl.ts第175行

function combine(options: Intl.DateTimeFormatOptions[]): Intl.DateTimeFormatOptions {
  return (<any>Object).assign({}, ...options);
}

调用该combine函数的代码是 @ angular / common / src / pipes / intl.ts第48行:

'yMMMdjms': datePartGetterFactory(combine([


更新

似乎实际的错误是该.assign方法未在IE11中实现


1
@ samuel-liew能否请您复习我的问题并关闭它。我觉得它不需要任何新的答案。
Tjaart van der Walt

Answers:


99

如果您正在使用@angular/cli并打算支持IE9-11,则可以编辑src/polyfills.ts文件以启用适当的polyfill。所需的polyfill已存在于文件中,因此您只需取消注释即可。

默认情况下,@angular/cli项目以开箱即用的“常绿”浏览器为目标,这意味着不立即支持IE,但是您可以通过导入所需的功能的polyfill添加支持。


4
这篇博客文章似乎证实了这个答案。
Stubbs'Apr

@spoida-polyfills文件如何工作?如果我不加评论,它会只对旧版浏览器使用polyfill,而对绿色浏览器使用标准方法吗?还是从现在开始只使用polyfill?
Diskdrive '17

@Diskdrive-通常,polyfill将检查浏览器的实现,并且仅在实现不完整时才添加内容。因此,是的,如果浏览器已经支持该功能,则不会使用polyfill的实现。
spoida

@spoida-谢谢,但是如果是这样,并且仅在浏览器需要时才使用它,为什么默认情况下将其注释掉?
Diskdrive '17

@Diskdrive-我怀疑这是因为与检查功能是否受支持相关的开销很小,而不仅仅是假设已实现并直接调用它。因此,如果您不针对IE,默认情况下Angular不会带来那么小的开销。如果确实需要以IE为目标,那么其他受支持的浏览器将对性能产生轻微影响,但它们仍将使用其本机实现而不是等效的JavaScript。另一方面,IE将依赖JavaScript实现,该实现可能比本地实现慢几个数量级。
spoida

28

Angular依赖core-js。因此,您可以从中使用Object.assign polyfills:

import "core-js/client/shim"; // or load it before other angular2 & zone.js stuff
import "zone.js";
import "reflect-metadata";

5
队友,如果您提到这些行在src / polyfills.ts中,您的答案将获得更多投票。反正谢谢你,帮我解决了问题!
VeganHunter

6
VS2017没有polyfills文件,所以我在启动应用程序ts文件中添加了代码...工作得很好...谢谢
davaus

2
在新的VS2017 SPA模板中,只需将core-js行添加到boot.server.ts和boot.browser.ts
Vishal

22

Angular Materials教程没有提到这个问题真是令人讨厌。任何使用IE11并遵循其教程的人都将遇到此问题。

正如其他人所提到的,解决方案是简单地取消注释项目polyfills.ts文件中的那些行。

在此处输入图片说明

但实际上,应该在他们的教程中提到它。

我花了太多时间在Google搜索上寻找解决这些Angular问题的方法...


1
我完全同意你的看法。我对angular 4还是陌生的,尽管我以前使用过angularjs,但仍然找不到解决方案,也无法猜测这里出了什么问题。但是,谢谢,这对我来说比另一个更好。
士兰

21

根据MDNObject.assign()浏览器兼容性,不支持IE。

您可以使用npmObject.assign通过MDN导入polyfill。(mdn-polyfills

跑: npm i mdn-polyfills --save

采用: import 'mdn-polyfills/Object.assign';


3
另一个答案是处理core-js,这是最简单的答案,因为angular已经依赖于core-js,并且不会带来其他依赖性。
安德鲁·兰德斯维克

@AndrewLandsverk这是新的吗?它过去依赖于其他polyfills的集合。大多数angular 2入门套件core-js,但据我所知并不是必需的。
Aluan Haddad

1
@AluanHaddad我不认为它是新的,而且我可以肯定它是必需的(如果不是直接的,则不是角度本身的传递性依赖)。
Andrew Landsverk

1
@AndrewLandsverk谢谢。你确实是对的。它直接列为依赖项。
Aluan Haddad'3

我在IE和Safari中遇到相同的错误,此操作在IE上运行后,我取消了对polyfill.js中相关行的注释,但Safari仍然显示相同的错误。请提出在野生动物园中解决此问题的方法。
Umang Patwa

10

在IE浏览器中工作

步骤1:执行npm i mdn-polyfills --save

步骤2:开启 polyfills.ts

步骤3:取消注释/ ** IE9,IE10和IE11下文件中的导入,需要以下所有polyfill。** /


2
找不到polyfills.ts
Satendra Jindal

6

在您的polyfills.ts上添加:

import 'core-js/es6/symbol';
import 'core-js/es6/object';
import 'core-js/es6/function';
import 'core-js/es6/parse-int';
import 'core-js/es6/parse-float';
import 'core-js/es6/number';
import 'core-js/es6/math';
import 'core-js/es6/string';
import 'core-js/es6/date';
import 'core-js/es6/array';
import 'core-js/es6/regexp';
import 'core-js/es6/map';
import 'core-js/es6/set';

谢谢!另外,这组pollyfills与本例中的非常相似:github.com/johnpapa/one-with-angular/blob/master/src/…–
BBaysinger

另外,我刚刚注意到,我链接到的示例显然包含在Angular-CLI的全新安装中(我的是1.0.3)。您只需要取消注释。
BBaysinger

是。你纠正。您可以取消注释polyfills文件中的某些行。与angular-cli
Yoav Schniederman '17

@YoavSchniederman我在IE和中都遇到了同样的问题,在此之后Safari,我在该行中未注释相关行,但 仍显示相同的错误。请提出如何在野生动物园中解决此问题的建议。polyfill.jsIEsafari
Umang Patwa

5

如果有人在使用IE的dotnet core 2.0 Angular模板中遇到此错误,这就是我解决的方法。

  1. 安装core-js

    npm install core-js-保存

  2. 将此行添加到ClientApp / boot.browser.ts的顶部

    导入'core-js / client / shim';


4

如果您使用的是angular 4.x,并且遇到此错误,则https://github.com/angular/angular-cli/issues/6036中描述的解决方案对我来说很有效。

似乎“ zone.js”的0.8.8版存在一个错误。但是,降级到0.8.4版解决了该问题。请参阅链接查看更多细节。


没有其他解决方案对我有用,但是这个解决方案有效,谢谢。但是我启用了polyfills并安装了软件包。
sa_

3

Angular 4 IE11修复无法获取属性“应用”

步骤1:打开app / boot-browser-ts

步骤2:添加以下行

import 'core-js/client/shim'; 

2

似乎angular-cli(v1.0.0-rc.0)具有名为polyfills.ts的文件,您必须在其中取消注释浏览器所需的所有polyfills,它对IE-11零安装对我很有用。


Full V1带有有价值的注释,因此您也知道如何使用它!
乔诺·斯图尔特

我真的看不到这个答案除了发布时已经存在的答案之外还能带来什么价值。
Makyen

1

Stas Berkov是正确的,他的回答使我得出了一个略有不同的解决方案:

在我加载所有Angular脚本的标头中,包含shim.js。(我捆绑/缩小部署)。重要说明:务必先将shim.js加载到zone.js之前,否则会出现其他错误。

<script src="/<my domain>/node_modules/core-js/client/shim.js"></script>
<script src="/<my domain>/node_modules/zone.js/dist/zone.js"></script>
<script src="/<my domain>/node_modules/reflect-metadata/Reflect.js"></script>
<script src="/<my domain>/node_modules/systemjs/dist/system.src.js"></script>

<script src="/<my domain>/systemjs.config.js"></script>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.