95 votes

Comment lier une variable statique d'un composant en HTML dans angular 2 ?

Je veux utiliser une variable statique d'un composant dans une page HTML. Comment lier une variable statique d'un composant avec un élément HTML en angular 2 ?

import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs/Rx';
@Component({
  moduleId: module.id,
  selector: 'url',
  templateUrl: 'url.component.html',
  styleUrls: ['url.component.css']
})
export class UrlComponent {

  static urlArray;
  constructor() {
  UrlComponent.urlArray=" Inside Contructor"
  }
}

<div>
  url works!
   {{urlArray}}
</div >

141voto

Günter Zöchbauer Points 21340

La portée des expressions de liaison dans un modèle de composants est l'instance de la classe de composants.

Vous ne pouvez pas faire référence aux globales ou aux statiques directement.

Comme solution de rechange, vous pouvez ajouter un getter à la classe de vos composants.

export class UrlComponent {

  static urlArray;
  constructor() {
    UrlComponent.urlArray = "Inside Contructor";
  }

  get staticUrlArray() {
    return UrlComponent.urlArray;
  }

}

et l'utiliser comme :

<div>
  url works! {{staticUrlArray}}
</div>

0 votes

Si le HTML a une boucle for, alors ? J'ai une boucle qui accède à la variable statique de l'élément. Si j'utilise "let person of persons()", cela ne fonctionne pas. Ici, la méthode persons renvoie plusieurs personnes. J'obtiens l'erreur "TypeError : self.context.persons is not a function".

0 votes

@rajm Veuillez créer une nouvelle question avec un code minimal permettant de reproduire.

0 votes

46voto

mithus7 Points 91

Pour éviter qu'Angular appelle get staticUrlArray à chaque cycle, vous pouvez enregistrer une référence de classe dans la portée publique du composant :

export class UrlComponent {

  static urlArray;

  public classReference = UrlComponent;

  constructor() {
    UrlComponent.urlArray = "Inside Contructor";
  }

}

Et ensuite vous pouvez l'utiliser directement :

<div>
  url works! {{ classReference.urlArray }}
</div>

3 votes

Pour une simple variable que j'utilisais pour l'état d'une case à cocher, cette méthode évitait des dizaines d'appels à la fonction get. Si elle était utilisée dans une boucle (par exemple les lignes d'un tableau), cela pourrait vraiment être préjudiciable. Je dirais que c'est la meilleure réponse et que la syntaxe est un peu plus simple.

0 votes

C'est une solution très intéressante. Déclarer une référence à une classe dans la classe elle-même semble un peu étrange. Mais cela fonctionne dans Angular.

3voto

mmey Points 1171

Vous pouvez aussi simplement déclarer un champ du type de la classe, comme tel :

export class UrlComponent {
  static urlArray;

  UrlComponent = UrlComponent;

  constructor() {
    UrlComponent.urlArray=" Inside Contructor"
  }
}

Vous pouvez ensuite faire référence aux variables statiques en utilisant ce préfixe :

<div>
  url works! {{UrlComponent.urlArray}}
</div>

Cela fonctionne également / est nécessaire pour référencer des choses comme les Enums ou des objets comme la console directement dans votre modèle.

0 votes

Ressemble beaucoup à la réponse de mithus7

0 votes

@BogdanD, en effet, avec la petite différence que j'utilise "UrlComponent = UrlComponent" car je trouve cela plus expressif que d'utiliser une "classReference" générique qui ne montre pas de quelle classe nous parlons. Aussi, j'ai répondu en mars alors que mithus7 a répondu en avril... En regardant, j'ai remarqué que j'avais une typo dans le modèle, j'ai corrigé ça...

0voto

Felix A. Points 61

Il est intéressant de noter que l'utilisation d'un attribut de classe préfixé par "readonly" dans le modèle fonctionne. Par conséquent, si votre variable statique s'avère être en fait une constante, allez-y et utilisez la fonction

export class UrlComponent {
    readonly urlArray;
}

0voto

Michal.S Points 321

Solution sans codage dans le constructeur :

export class UrlComponent {

  readonly static urlArray = ' Inside Class';

  readonly UrlArray = UrlComponent.urlArray;

  constructor() {  }
}

vous pouvez utiliser ce champ statique dans d'autres composants ou classes :

import {UrlComponent} from 'some-path';
export class UrlComponent2 {
  readonly UrlArray = UrlComponent.urlArray;
}

en utilisant dans le modèle (notez le "U" majuscule dans UrlArray ) :

<div>
  url works!
  {{UrlArray}}
</div>

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