Кутова 2, чому зірочка (*)


90

У документі angular 2, * та шаблоні , ми знаємо, що * ngIf, * ngSwitch, * ngFor можна розширити до тегу ng-template. Моє запитання:

Я думаю, що ngIfабо ngForбез, *також можна перекласти та розширити до тегу шаблону за допомогою кутового механізму.

Наступний код

<hero-detail *ngIf="currentHero" [hero]="currentHero"></hero-detail>

буде таким же, як

<ng-template [ngIf]="currentHero">
  <hero-detail [hero]="currentHero"></hero-detail>
</ng-template>

То навіщо турбуватися про розробку дивного символу зірочки ( *) у кутовій 2?


За посиланням ми не бачили <template>тегів, оскільки *синтаксис префіксу дозволяв пропустити ці теги та зосередитись безпосередньо на елементі HTML, який ми включаємо, виключаємо або повторюємо.
Тушар


3
Ваш вибір - використовувати безпосередньо тег шаблону, в іншому випадку ви можете використовувати символ *, який піклується про тег шаблону. - Джерело
Тушар

Відповіді:


89

Синтаксис зірочок - це синтаксичний цукор для більш багатослівного синтаксису шаблону, директива якого розширюється до капота, ви можете вільно використовувати будь-який із цих параметрів.

Цитата з документації :

Зірочка - "синтаксичний цукор". Це спрощує ngIf та ngFor як для автора, так і для читача. Під капотом Angular замінює версію зірочки на більш багатослівну форму.

Наступні два приклади ngIf фактично однакові, і ми можемо писати в будь-якому стилі:

<!-- Examples (A) and (B) are the same -->

<!-- (A) *ngIf paragraph -->
<p *ngIf="condition">
  Our heroes are true!
</p>

<!-- (B) [ngIf] with template -->
<template [ngIf]="condition">
  <p>
    Our heroes are true!
  </p>
</template>

саме про це йдеться в документі. Вибачте за неточні вирази мого значення, я змінив деталь запитання.
maxisacoder

2
Я маю на увазі, навіщо розробляти цей цукор, чому просто розширювати за замовчуванням без використання *.
maxisacoder

2
Є кілька причин, про які я можу придумати: 1. ngIf="expression"не є вхідним прив'язуванням. Якщо ви отримаєте значення від DOM, це буде рядок. 2. Фреймворк повинен знати, ngIfа також інші особливі випадки. Звичайно, вказати логічний атрибут десь на DDO буде добре, але вам потрібно заглянути в код / ​​документи, щоб дізнатися різницю між звичайним атрибутом та структурним вказівним цукром. 3. Квадратні дужки, асериск, дужки та їх відсутність чітко передають те, що відбувається в програмі зчитування шаблонів.
Klaster_1

1
Чому це працювало без зірочки в ng1, писати ng-if, ng-show тощо?
RubberDuckRabbit

1
@RubberDuckRabbit, оскільки ng1 має абсолютно різну реалізацію прив'язки. Він був перероблений для ng2 +.
Klaster_1

32

Angular2 пропонує спеціальний тип директив - структурні директиви

Структурні директиви базуються на <template>тезі.

*До атрибута селектора вказує на те, що структурна директива повинна бути застосована замість звичайної директиви атрибута або властивості зв'язування. Angular2 внутрішньо розширює синтаксис до явного <template>тегу.

Оскільки final є також <ng-container>елемент, який може використовуватися подібно до <template>тегу, але підтримує більш поширений короткий синтаксис. Це, наприклад, потрібно, коли дві структурні директиви повинні застосовуватися до одного елемента, який не підтримується.

<ng-container *ngIf="boolValue">
  <div *ngFor="let x of y"></div>
</ng-container>

21

Кутова обробляє елементи шаблону по-особливому. *Синтаксис ярлик , який дозволяє анулювання писати весь <template>елемент. Дозвольте мені показати вам, як це працює.

використовуючи це

*ngFor="let t of todos; let i=index"

знецірює його

template="ngFor: let t of todos; let i=index" 

який знецірює

<template ngFor [ngForOf]="todos" .... ></template>

також структурні директиви кутові як ngFor, ngIf і т.д. префікс *просто відрізнити від цього користувача директив і компонентів

дивіться більше тут

https://vsavkin.com/angular-2-template-syntax-5f2ee9f13c6a#.rcffirs7a


3

З кутових документів :

Структурні директиви відповідають за розмітку HTML. Вони формують або змінюють структуру DOM, як правило, додаючи, видаляючи або маніпулюючи елементами.

Як і в інших директивах, ви застосовуєте структурну директиву до елемента хосту . Потім директива робить все, що вона повинна робити з цим елементом хосту та його нащадками.

Структурні директиви легко впізнати. Зірочка (*) передує імені атрибута директиви, як у цьому прикладі.

<p *ngIf="userInput">{{username}}</p>

2

Іноді вам може знадобитися, <a *ngIf="cond">наприклад, коли це лише один тег. іноді вам може знадобитися розмістити ngIf навколо декількох тегів, не маючи справжнього тегу як обгортку, яка веде вас до <template [ngIf]="cond">тегу. як angular може знати, чи повинен він відображати власника директиви ngIf у кінцевому результаті html чи ні? так що це щось більше, ніж просто зробити код більш зрозумілим. це необхідна різниця.

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