69 votes

Angular2 IE11 Impossible d'obtenir la propriété 'apply' d'une référence non définie ou nulle

J'obtiens l'erreur suivante après avoir mis à niveau mes paquets angular2 vers les versions suivantes :

  • @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-browser" : "^2.3.1"
  • @angular/platform-browser-dynamic" : "^2.3.1
  • @angular/platform-server" : "^2.3.1
  • @angular/router" : "^3.3.1

Erreur : Unable to get property 'apply' of undefined or null reference

enter image description here

Je n'obtiens cette erreur que dans IE11, dans Chrome cela fonctionne bien.

J'ai fait quelques recherches et la ligne qui provoque l'erreur se trouve dans le module angular/common :

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

Le fichier dactylographié :

@angular/common/src/pipes/intl.ts ligne 175

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

Le code qui appelle le combine La fonction est @angular/common/src/pipes/intl.ts ligne 48 :

'yMMMdjms': datePartGetterFactory(combine([


UPDATE

Il semble que l'erreur réelle soit que le .assign n'est pas implémentée dans IE11

1 votes

@samuel-liew pouvez-vous s'il vous plaît revoir ma question et la fermer. Je pense qu'elle n'a pas besoin de nouvelles réponses.

99voto

spoida Points 121

Si vous utilisez @angular/cli et que vous avez l'intention de prendre en charge IE9-11, vous pouvez modifier le fichier src/polyfills.ts pour activer les polyfills appropriés. Les polyfills nécessaires sont déjà dans le fichier, il suffit donc de les décommenter.

Par défaut @angular/cli Les projets ciblent d'emblée les navigateurs "evergreen", ce qui signifie que IE n'est pas immédiatement pris en charge, mais que vous pouvez ajouter une prise en charge en important des polyfills pour les fonctionnalités dont vous avez besoin.

4 votes

Cet article de blog semble confirmer cette réponse.

0 votes

@spoida - comment fonctionne le fichier polyfills ? Si je le décommente, est-ce qu'il va seulement utiliser le polyfill pour les anciens navigateurs et utiliser la méthode standard pour les navigateurs verts ? Ou bien utilisera-t-il uniquement le polyfill à partir de maintenant ?

0 votes

@Diskdrive - typiquement, le polyfill va inspecter l'implémentation du navigateur et n'ajoutera des choses que si l'implémentation est incomplète. Donc, oui, si le navigateur supporte déjà la fonctionnalité, l'implémentation du polyfill ne sera pas utilisée.

28voto

Stas Berkov Points 614

Angular est dépendant de core-js . Ainsi, vous pouvez utiliser Objet.assign polyfills à partir de celui-ci :

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

5 votes

Mon pote, ta réponse obtiendrait plus de votes si tu mentionnais que ces lignes se trouvent dans src/polyfills.ts. Merci quand même, cela m'a aidé à résoudre le problème !

6 votes

VS2017 n'a pas de fichier polyfills, j'ai donc ajouté le code dans le fichier ts de l'application de démarrage...cela a bien fonctionné...merci

2 votes

Dans les nouveaux modèles de SPA de VS2017, il suffit d'ajouter l'attribut core-js à boot.server.ts et boot.browser.ts

22voto

Mike Gledhill Points 2105

C'est vraiment ennuyeux que le Tutoriel sur les matériaux angulaires ne mentionne pas ce problème. Toute personne utilisant IE11 et suivant leur tutoriel rencontrera ce problème.

La solution, comme d'autres l'ont mentionné, est simplement de décommenter ces lignes dans le fichier de projet polyfills.ts fichier.

enter image description here

Mais vraiment, cela aurait dû être mentionné dans leur tutoriel.

Je passe beaucoup trop d'heures sur Google pour trouver des solutions à ces problèmes Angular...

1 votes

Je suis tout à fait d'accord avec vous. Je suis nouveau dans angular 4, bien que je travaillais avec angularjs avant, je n'ai toujours pas trouvé la solution et je ne pouvais pas deviner ce qui a mal tourné ici. Mais merci, cela a mieux fonctionné pour moi que l'autre.

21voto

Aldracor Points 926

Selon MDN Object.assign() Compatibilité des navigateurs IE n'est pas pris en charge.

Vous pouvez importer le Object.assign polyfill par MDN avec npm. ( mdn-polyfills )

Cours : npm i mdn-polyfills --save

Utilisez : import 'mdn-polyfills/Object.assign';

3 votes

L'autre réponse, traiter avec core-js est la réponse la plus facile car angular dépend déjà de core-js et n'apportera pas de nouvelle dépendance.

0 votes

@AndrewLandsverk Est-ce nouveau ? Il dépendait auparavant d'une collection d'autres polyfills. La plupart d'angular 2 kits de démarrage core-js, mais ce n'est pas nécessaire pour autant que je sache.

1 votes

@AluanHaddad Je ne crois pas que ce soit nouveau et j'étais à peu près certain qu'il était requis (si ce n'est pas directement, mais comme une dépendance transitive d'angular lui-même).

10voto

Sreenath S Points 155

Pour travailler dans le navigateur IE

Étape 1 : Cours : npm i mdn-polyfills --save

Étape 2 : Ouvrir polyfills.ts

Étape 3 : UnComment les importations dans le fichier sous /** IE9, IE10 et IE11 requiert tous les polyfills suivants. **/

2 votes

N'a pas pu trouver le fichier polyfills.ts

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X