Escrito el 02/04/2024

Angular Pro: Content Proyection

Content Projection permite injectar contenido en algún lugar.

Proyection

Si tenemos un componente que nos sirve para dos funcionalidades diferentes. Por ejemplo un formulario

<div>
  <h3>Title</h3>
  <label for="name">Name</label>
  <input type="text" name="name" />
  <button type="submit">Submit</button>
</div>

que se utiliza en varios lugares

<div>
  <form-component (onSubmit)="handleCreate($event)"></form-component>
  <form-component (onSubmit)="handleUpdate($event)"></form-component>
</div>

pero queremos que el titulo sea distinto en cada lugar. Lo hace hacemos es:

<div>
  <ng-content></ng-content>
  <label for="name">Name</label>
  <input type="text" name="name" />
  <button type="submit">Submit</button>
</div>
<div>
  <form-component (onSubmit)="handleCreate($event)">
    <h3>Create Element</h3>
  </form-component>
  <form-component (onSubmit)="handleUpdate($event)">
    <h3>Update Element</h3>
  </form-component>
</div>

Slots

Para poder proyectar contendido en diferentes lugares, se pueden usar:

selectors

Para projectar tags.

<div>
  <ng-content select="h3"></ng-content>
  <label for="name">Name</label>
  <input type="text" name="name" />
  <ng-content select="button"></ng-content>
</div>
<div>
  <form-component (onSubmit)="handleCreate($event)">
    <h3>Create Element</h3>
    <button type="submit">Create</button>
  </form-component>
  <form-component (onSubmit)="handleUpdate($event)">
    <h3>Update Element</h3>
    <button type="submit">Update</button>
  </form-component>
</div>

slots

Para projectar components.

<div>
  <ng-content select="app-title"></ng-content>
  <label for="name">Name</label>
  <input type="text" name="name" />
  <ng-content select="button"></ng-content>
</div>
<div>
  <form-component (onSubmit)="handleCreate($event)">
    <app-title>Create Element</app-title>
    <button type="submit">Create</button>
  </form-component>
  <form-component (onSubmit)="handleUpdate($event)">
    <h3>Update Element</h3>
    <button type="submit">Update</button>
  </form-component>
</div>