66 votes

Que fait l'attribut "ng-reflect-*" dans Angular2/4 ?

Ici, j'ai une structure de données complexe dans une application Angular4.

Il s'agit d'un multigraphe dirigé paramétré avec des dictionnaires à la fois sur les nœuds et sur les liens. Mes composants angulaires travaillent sur ce modèle de données complexe.

Dans Angular2.4, tout fonctionnait bien. Depuis que nous sommes passés à Angular4, je reçois ceci dans mon DOM :

<g flareNode="" ng-reflect-model="{'id':'an-id-of-my-object'">

...qui est généré à partir de l'extrait de modèle suivant :

<svg:g flareNode [model]="item"></svg:g>

Note, model est ici simplement un membre de données de mon composant. Il n'a pas (...ne devrait pas avoir) de signification spécifique à Angular2. Il fait partie de la structure de données complexe de mon application.

Ma première impression est qu'Angular sérialise le model de la classe composant, récupère ses 30 premiers caractères, puis place ce truc totalement inutile dans le DOM !

Est-ce que j'ai raison ? Qu'est-ce que tout ça ng-reflect-model dans le DOM, quel usage spécifique a-t-il dans Angular4 qu'il n'avait pas dans Angular2 ?

3 votes

Remarque : il s'agit no une question de débogage, j'ai donné ici bien trop peu d'informations pour cela. Le point central de la question, ce que le ng-reflect-model et peut-être que cela pourrait être la raison de ce comportement étrange (mettre les 30 premiers caractères d'un objet dans le DOM comme valeur d'un attribut). Toute réponse expliquant quel est le rôle de l'attribut ng-reflect-model dans le cadre d'Angular est déjà acceptable.

1 votes

Je ne peux pas voir ng-reflect attributs ajoutés à mes composants, mais ils ont été ajoutés dans la 2.4. Si vous créez un plunker avec DOM avec de tels attributs, j'y jetterai un coup d'oeil.

0 votes

@Maximus Oui, dans mon cas, ng-reflect- est présent dans la 4.0, mais il ne l'était pas dans la 2. Créer un plunker ne serait pas pratique (c'est un gros code, fortement dépendant, en extraire une petite partie serait irréalisable). Quoi qu'il en soit, ce que je veux ici, ce n'est pas une aide au débogage, mais plutôt une meilleure compréhension, à quoi sert cette chose ng-reflect, et que je vois très bien, que les composants angulaires se comportent différemment sur les 30 premiers caractères de leurs variables de modèle sérialisées.

102voto

Maximus Points 1342

ng-reflect-${name} sont ajoutés à des fins de débogage et indiquent les liaisons d'entrée qu'un composant/directive a déclarées dans sa classe. Ainsi, si votre composant est déclaré comme ceci :

class AComponent {
  @Input() data;
  @Input() model;
}

le html résultant sera rendu comme ceci :

<a-component ng-reflect-data="..." ng-reflect-model="...">
   ...
<a-component>

Ils n'existent que lorsque le mode débogage est utilisé - mode par défaut pour Angular. Pour les désactiver, utilisez

import {enableProdMode} from '@angular/core';

enableProdMode();

à l'intérieur de main.ts fichier. Ces attributs sont ajoutés par cette fonction ici :

function debugCheckAndUpdateNode(...): void {
  const changed = (<any>checkAndUpdateNode)(view, nodeDef, argStyle, ...givenValues);
  if (changed) {
    const values = argStyle === ArgumentType.Dynamic ? givenValues[0] : givenValues;
    if (nodeDef.flags & NodeFlags.TypeDirective) {
      const bindingValues: {[key: string]: string} = {};
      for (let i = 0; i < nodeDef.bindings.length; i++) {
        const binding = nodeDef.bindings[i];
        const value = values[i];
        if (binding.flags & BindingFlags.TypeProperty) {
          bindingValues[normalizeDebugBindingName(binding.nonMinifiedName !)] =
              normalizeDebugBindingValue(value); <------------------
        }
      }

    ...

    for (let attr in bindingValues) {
      const value = bindingValues[attr];
      if (value != null) {
        view.renderer.setAttribute(el, attr, value); <-----------------

1 votes

@yurzui, merci pour votre commentaire, je suis vraiment flatté. Cela prend du temps de déboguer les sources et c'est toujours un bon sentiment quand je sais que quelqu'un en profite ! Si vous ne me suivez pas encore sur support n'hésitez pas :)

0 votes

@yurzui, oui, tu écris ?

0 votes

Si je passe des objets aux propriétés d'entrée, j'obtiens quelque chose comme : ng-reflect-model="[object Object]" . Comment savoir de quel objet il s'agit ?

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