Saltar al contenido principal
Neural UIv2.0.0Documentación
Ver v1 GitHub

Propiedad del estado

Decide quién cambia un valor y distingue inputs, modelos, propuestas y eventos.

Mapa de contratos A–F

Consulta la API del componente para elegir el binding. Un nombre terminado en Change no siempre representa un modelo. Esta tabla describe las seis responsabilidades con ejemplos reales de Neural.

Contrato
Quién gobierna el estado
¿Puede el componente aplicar un valor?
Qué recibe la aplicación
Ejemplo Neural
A · INPUTAplicaciónNo: lee el valor que recibe.Nada automáticamente.Button.disabled
B · MODELValor editable compartidoSí, mediante el modelo documentado.El valor actualizado.Input.value / valueChange
C · PROPOSALAplicaciónNo: la aplicación acepta o rechaza.Una solicitud, no un resultado aplicado.Dialog.open / closeRequested
D · DOMAIN EVENTLa aplicación decide la consecuencia.No implica actualizar un estado.Interacción y payload.Button.neuClick: MouseEvent
E · LIFECYCLEEl ciclo de vida observadoNo es un valor editable.Notificación tras la transición documentada.Dialog.opened / closed
F · INTERNAL DERIVEDImplementación del componenteDeriva el comportamiento del estado público.Ningún binding público adicional.Button bloquea la activación con disabled o loading.

A · Configura con un input

La aplicación proporciona Button.disabled. Cambiar su signal decide si el botón puede activarse; Button no devuelve un nuevo valor de disabled. Este ejemplo es síncrono y solo enseña quién gobierna un input.

example.ts
import { Component, signal } from '@angular/core';
import { NeuButtonComponent } from '@neural-ui/core/button';
import { NeuSwitchComponent } from '@neural-ui/core/switch';

@Component({
  selector: 'app-input-example',
  imports: [NeuButtonComponent, NeuSwitchComponent],
  template: `
    <neu-switch
      label="Block action"
      [(checked)]="blocked"
    />
    <button
      neu-button
      type="button"
      [disabled]="blocked()"
      (neuClick)="count.update(increment)"
    >
      Run
    </button>
    <output aria-live="polite">{{ count() }}</output>
  `,
})
export class InputExample {
  readonly blocked = signal(false);
  readonly count = signal(0);
  readonly increment = (value: number) => value + 1;
}

B · Edita un valor compartido

Input emite valueChange después de editar. El handler actualiza el mismo signal que proporciona value. Restablecer cambia ese signal desde la aplicación; no hay otro valor local. [(value)]="name" es la forma bidireccional equivalente: elige una forma de binding para cada control.

B · Edita un valor compartido
Valor: Neural · 0

C · Acepta o rechaza una propuesta

Abre Dialog y pulsa Escape. Si la aceptación está activada, el handler cambia open a false. Si está desactivada, se emite closeRequested, pero open sigue en true. Terminar y cerrar ejecuta una acción explícita de aplicación. Core devuelve el foco cuando el diálogo se cierra de verdad.

No utilices [(open)] aquí: Dialog expone un input y una solicitud, no un modelo open.

C · Acepta o rechaza una propuesta
· opened: 0 · closed: 0

D · Reacciona a una interacción

Button.neuClick comunica una activación con un MouseEvent. La aplicación decide la consecuencia. En el primer componente aumenta un contador; también podría abrir una tarea o iniciar una operación.

E · Observa cambios del ciclo de vida

opened y closed del ejemplo Dialog observan las transiciones del estado open aplicado. No solicitan un cambio y no deben convertirse en otro binding de open. Los contadores empiezan en cero: Core no emite ese ciclo de vida durante el primer render.

F · Deja el comportamiento derivado al componente

Button deriva el bloqueo de activación de disabled y loading. Configura esos inputs públicos; no enlaces helpers internos ni reproduzcas manualmente su semántica deshabilitada.