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

时间:2016-12-22 06:04:14

标签: javascript angular typescript

将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

enter image description here

我只在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([

更新

似乎实际的错误是IE11中没有实现.assign方法

11 个答案:

答案 0 :(得分:98)

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

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

答案 1 :(得分:27)

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";

答案 2 :(得分:21)

根据MDN Object.assign() Browser compatibility,IE不受支持。

您可以使用{h MDN导入Object.assign polyfill。 (mdn-polyfills

生成: npm i mdn-polyfills --save

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

答案 3 :(得分:21)

Angular Materials tutorial没有提到这个问题真的很烦人。任何使用IE11并遵循他们的教程的人都会遇到这个问题。

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

enter image description here

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

我花了太多时间谷歌搜索找到这些角度问题的解决方案......

答案 4 :(得分:10)

在IE浏览器中工作

第1步:运行: npm i mdn-polyfills --save

第2步:打开 polyfills.ts

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

答案 5 :(得分: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';

答案 6 :(得分:5)

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

  1. 安装core-js

    npm install core-js --save

  2. 在ClientApp / boot.browser.ts

    的顶部添加此行

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

答案 7 :(得分:4)

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

似乎“zone.js”版本0.8.8存在错误。但是,降级回0.8.4版解决了这个问题。有关更多详细信息,请参阅链接。

答案 8 :(得分:3)

Angular 4 IE11修复无法获取属性&#39;应用&#39;

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

第2步:添加以下行

final ParseFile bitmapFile = new ParseFile(imageInByte);
bitmapFile.saveInBackground(new SaveCallback() {
        @Override
        public void done(ParseException e) {
        if(e==null){
             Log.i("hello","  photo saved ");
             ParseObject userDisplayImage = new ParseObject("UserDisplayImage");
             userDisplayImage.put("photo", bitmapFile);
             userDisplayImage.saveInBackground ();
        } else {
             e.printStackTrace();
             Log.i("Error", e + "photo not saved");
        }

    }
});

答案 9 :(得分:2)

似乎angular-cli(v1.0.0-rc.0)有一个名为polyfills.ts的文件,你必须在浏览器中取消注释所有必需的polyfill,它对我来说很好,在IE-11中没有安装

答案 10 :(得分:1)

Stas Berkov是对的,他的回答让我得到了一个稍微不同的解决方案:

在我加载所有Angular脚本的标题中,我包含了shim.js. (我在部署时捆绑/缩小)。注意:在zone.js之前加载shim.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>