Як прив'язати статичну змінну компонента в HTML в angular 2?


79

Я хочу використовувати статичну змінну компонента на HTML-сторінці. Як зв'язати статичну змінну компонента з елементом HTML в 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 >

Відповіді:


118

Обсяг виразів прив'язки у шаблоні компонентів - це екземпляр класу компонентів.

Ви не можете безпосередньо посилатися на глобальні чи статичні дані.

Як обхідне рішення ви можете додати геттер до свого класу компонентів

export class UrlComponent {

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

  get staticUrlArray() {
    return UrlComponent.urlArray;
  }

}

і використовувати його як:

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

Якщо HTML має цикл for, то? У мене є цикл, який отримує доступ до статичної змінної компонента .. Якщо я використовую "let person of persons ()", це не працює. Тут метод persons повертає кілька осіб .. помилка "TypeError: self.context.persons is not a function"
raj m

@rajm Будь ласка, створіть нове запитання з мінімальним кодом, що дозволяє відтворювати.
Günter Zöchbauer

щойно опубліковано .. stackoverflow.com/questions/40173118/…
raj m

4
Ні, вам точно не потрібен ()геттер, і він не повинен там бути. get staticUrlArray() {}is not public staticUrlArray() {}Один доступ безпосередньо подібний staticUrlArray, інший як метод подібний staticUrlArray().
Тімоті Зорн

1
Дивіться нижче посилання також для довідки.: Github.com/angular/angular/issues/6429
Sudhakar

38

Щоб уникнути Angular-виклику get staticUrlArray під час кожного циклу, ви можете зберегти посилання на клас у загальнодоступній області дії компонента:

export class UrlComponent {

  static urlArray;

  public classReference = UrlComponent;

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

}

І тоді ви можете використовувати його безпосередньо:

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

3
Для простої змінної, яку я використовував для стану прапорця, цей метод уникнув десятків викликів функції get. Якщо використовуватись у циклі (наприклад, у рядках таблиці), це дійсно може завдати шкоди. Я б сказав, що це краща відповідь, а синтаксис дещо простіший.
Дін

Це дуже цікаве рішення. Оголошення посилання на клас у самому класі здається дивним. Але це працює в Angular.
Сер Папілоній,

1

Ви також можете просто оголосити поле типу класу як таке:

export class UrlComponent {
  static urlArray;

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

Потім ви можете посилатися на статичні змінні, використовуючи цей префікс:

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

Це також працює / необхідно для посилання на матеріали, такі як Enums, або такі об’єкти, як консоль, безпосередньо у вашому шаблоні.


здається дуже схожим на відповідь mithus7
Богдан Д

@BogdanD, справді, з тією невеликою різницею, що я використовую "UrlComponent = UrlComponent", оскільки я вважаю це більш виразним, ніж використання загального "classReference", який не показує, про який клас ми говоримо. Крім того, я відповів у березні, тоді як mithus7 відповів у квітні ... Подивившись, я помітив, що в шаблоні у мене була помилка, виправлено ...
mmey

0

Цікаво, що споживання атрибута класу з префіксом "readonly" у шаблоні ПРАЦЮЄ. Отже, якщо ваша статична змінна виявляється насправді константою, продовжуйте і використовуйте

export class UrlComponent {
    readonly urlArray;
}

0

Рішення без кодування в конструкторі:

export class UrlComponent {

  readonly static urlArray = ' Inside Class';

  readonly UrlArray = UrlComponent.urlArray;

  constructor() {  }
}

Ви можете використовувати це статичне поле в інших компонентах або класах:

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

використання в шаблоні (примітка з великою буквою 'U' UrlArray)

<div>
  url works!
  {{UrlArray}}
</div>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.