Saltar al contenido principal
Neural Nativev0.1.0-beta.1Documentación

Importación

component.ts
import { NeuTreeSelectComponent } from '@neural-ui/native/tree-select';

Ejemplos

Importa ExampleComponent en su padre y coloca <app-example /> dentro del neu-theme raíz de tu aplicación. El preview aporta el marco y las zonas seguras; utiliza la estructura raíz de Instalación en tu app.

Dale un lugar a tu trabajo

Abre un selector jerárquico, despliega sus ramas y elige un departamento. La tarjeta refleja el nombre de la hoja seleccionada.

Ver y copiar el ejemplo completo
basic.component.ts
import { Component, signal, computed } from '@angular/core';
import { NeuCardComponent } from '@neural-ui/native/card';
import { NeuTreeSelectComponent } from '@neural-ui/native/tree-select';
import { View, Text, ScrollView } from '@ng-native/components';
import type { NeuTreeNode } from '@neural-ui/native';

@Component({
  selector: 'app-example',
  imports: [NeuCardComponent, NeuTreeSelectComponent, View, Text, ScrollView],
  template: `
    <scroll-view class="product-scroll" keyboardShouldPersistTaps="handled" [showsVerticalScrollIndicator]="true"><view class="product-stack"><view class="product-section"><text class="product-title" accessibilityRole="header">Dale un lugar a tu trabajo</text><text class="product-caption">Elige un departamento sin perder la estructura</text></view>
    <view class="product-surface"><neu-tree-select emptyLabel="No hay elementos" expandLabel="Expandir" closeLabel="Cerrar opciones" label="Departamento" [nodes]="nodes" [(value)]="selected" [leafOnly]="true" placeholder="Elige un departamento" />
    <text class="product-caption">Despliega Producto para ver sus equipos.</text></view>
    <neu-card title="Espacio del departamento" [description]="departmentLabel()" variant="outlined"><text class="product-caption">Los proyectos nuevos usarán este departamento en este ejemplo local.</text></neu-card></view></scroll-view>
  `,
  styles: `
.actions { gap: 12px; align-items: flex-start; } text { color: var(--neu-text, #172033); font-size: 16px; }

:host { flex: 1; flex-shrink: 1; min-height: 0; }
.product-scroll { flex: 1; flex-shrink: 1; height: 0px; min-height: 0; }
.product-stack { gap: 24px; padding-bottom: 20px; }
.product-section { gap: 12px; }
.product-row { flex-direction: row; align-items: center; gap: 12px; }
.product-copy { flex: 1; min-width: 0; gap: 4px; }
.product-title { color: var(--neu-text, #172033); font-size: 24px; line-height: 30px; font-weight: 600; }
.product-heading { color: var(--neu-text, #172033); font-size: 17px; line-height: 23px; font-weight: 600; }
.product-caption { color: var(--neu-muted, #596477); font-size: 14px; line-height: 20px; }
.product-actions { flex-direction: row; flex-wrap: wrap; align-items: center; gap: 8px; }
.product-surface { gap: 16px; padding: 16px; border-radius: 16px; background-color: var(--neu-surface, #ffffff); border-width: 1px; border-color: var(--neu-border, #a5afbf); }

  `,
})
export class ExampleComponent {
  readonly nodes: readonly NeuTreeNode[] = [
    { id: 'product', label: 'Producto', children: [
      { id: 'design', label: 'Diseño' },
      { id: 'engineering', label: 'Ingeniería' },
    ] },
    { id: 'operations', label: 'Operaciones' },
  ];
  readonly selected = signal('design');
  readonly departmentLabel = computed(() => this.nodes.flatMap(node => node.children?.length ? node.children : [node]).find(node => node.id === this.selected())?.label || '');
}

Departamento de solo lectura

Muestra un departamento que no se puede cambiar en esta pantalla.

Ver y copiar el ejemplo completo
selection-and-availability.component.ts
import { Component } from '@angular/core';
import { NeuTreeSelectComponent } from '@neural-ui/native/tree-select';
import { View, ScrollView } from '@ng-native/components';
import type { NeuTreeNode } from '@neural-ui/native';

@Component({
  selector: 'app-example',
  imports: [NeuTreeSelectComponent, View, ScrollView],
  template: `
    <scroll-view class="usage-scroll" keyboardShouldPersistTaps="handled"><view class="usage-stack">
    <neu-tree-select emptyLabel="No hay elementos" expandLabel="Expandir" closeLabel="Cerrar opciones" label="Departamento bloqueado" [nodes]="nodes" value="design" [readonly]="true" />
    </view></scroll-view>
  `,
  styles: `
.actions { gap: 12px; align-items: flex-start; } text { color: var(--neu-text, #172033); font-size: 16px; }

.usage-scroll { flex: 1; }
.usage-stack { gap: 20px; padding-bottom: 20px; }
.usage-section { gap: 12px; }
.usage-heading { color: var(--neu-text, #172033); font-size: 16px; font-weight: 600; }
.usage-caption { color: var(--neu-muted, #64748b); font-size: 14px; }
.usage-row { flex-direction: row; flex-wrap: wrap; gap: 12px; align-items: center; }
.usage-actions { flex-direction: row; flex-wrap: wrap; gap: 8px; align-items: center; }


  `,
})
export class ExampleComponent {
  readonly nodes: readonly NeuTreeNode[] = [
    { id: 'product', label: 'Producto', children: [
      { id: 'design', label: 'Diseño' },
      { id: 'engineering', label: 'Ingeniería' },
    ] },
    { id: 'operations', label: 'Operaciones' },
  ];
}
Playground interactivo

Ajusta la configuración y prueba el resultado.

Capturas del dispositivo en inglés.

Tree Select · android · native capture
AndroidCaptura nativa
Tree Select · ios · native capture
iOSCaptura nativa

Referencia API

Inputs

NombreTipoPredeterminadoEnlaceDescripción
nodesreadonly NeuTreeNode[][]InputNodos jerárquicos con hijos opcionales. Mantén IDs únicos en todo el árbol.
leafOnlybooleantrueInputRestringe los valores seleccionables a nodos hoja; los padres siguen organizando la jerarquía.
placeholderstring'Choose item'InputEjemplo o indicación mientras el valor está vacío; conserva una etiqueta independiente.
closeLabelstring'Dismiss options'InputTexto o nombre accesible utilizado para cerrar. No ejecuta la acción por sí solo.
expandLabelstring'Expand'InputTexto o nombre accesible utilizado para expandir. No ejecuta la acción por sí solo.
emptyLabelstring'No items'InputTexto o nombre accesible utilizado para estado vacío. No ejecuta la acción por sí solo.
labelstringObligatorioInputNombre legible del control, acción o grupo.
disabledbooleanfalseInputDesactiva la interacción del usuario. La aplicación puede seguir proporcionando valores.
readonlybooleanfalseInputImpide editar o seleccionar desde el control y conserva el valor actual.
invalidbooleanfalseInputMarca el control como inválido. El formulario o la aplicación aporta la regla de validación.
touchedbooleanfalseInputEstado de interacción con el campo, aportado manualmente o mediante Signal Forms.
hintstring''InputAyuda del campo que aparece cuando no se muestra un mensaje de error.
requiredbooleanfalseInputPresentación de campo obligatorio. Define la regla de validación real en el formulario de tu aplicación.
requiredLabelstring'Required'InputRequisito traducido que se anuncia con la ayuda cuando required es true. Required por defecto; no valida el valor.
errorstring''InputMensaje de error aportado por la aplicación; combínalo con el estado invalid del control.

Models

NombreTipoPredeterminadoEnlaceDescripción
valuestring''Model · bidireccionalValor editado o ID(s) seleccionado(s), según el tipo declarado. Enlaza una signal escribible mediante [(value)].

Outputs

NombrePayloadCuándo se emite
valueChangestringEmite el valor actualizado de value. [(value)] enlaza este output junto con su input model.
touchvoidComunica la interacción del usuario al formulario o aplicación que lo contiene.

Estado de los models

Enlaza la signal con [(nombreModel)] sin llamarla. Utiliza nombreModel() para leer su valor.

model-fields.ts
import { signal } from '@angular/core';

// Fields inside your component class
readonly value = signal<string>('');

Tipos e interfaces de datos

Utiliza los imports en tu aplicación. Las definiciones siguientes se muestran como referencia.

NeuOption

NeuOption.ts
import type { NeuOption } from '@neural-ui/native';

// Public definition for reference only. Import this type; do not redeclare it.
export interface NeuOption {
    readonly id: string;
    readonly label: string;
    readonly description?: string;
    readonly disabled?: boolean;
}
CampoTipoRequisitoSignificado
idstringObligatorioIdentificador estable y único para seguimiento y selección.
labelstringObligatorioNombre legible del elemento.
descriptionstringOpcionalTexto de apoyo opcional; su presentación depende del control.
disabledbooleanOpcionalImpide activar o seleccionar este elemento.

NeuTreeNode

NeuTreeNode.ts
import type { NeuTreeNode } from '@neural-ui/native';
import type { NeuOption } from '@neural-ui/native';

// Public definition for reference only. Import this type; do not redeclare it.
export interface NeuTreeNode extends NeuOption {
    readonly children?: readonly NeuTreeNode[];
}
CampoTipoRequisitoSignificado
childrenreadonly NeuTreeNode[]OpcionalNodos hijos recursivos; omítelo en un nodo hoja.
idstringObligatorioIdentificador estable y único para seguimiento y selección.
labelstringObligatorioNombre legible del elemento.
descriptionstringOpcionalTexto de apoyo opcional; su presentación depende del control.
disabledbooleanOpcionalImpide activar o seleccionar este elemento.