Validación
model.isValidLink (y model.isValidNode) se comprueban en dos sitios
distintos, con comportamiento distinto — este ejemplo deja probar ambos
por separado, para que no se mezclen:
- Arrastrando con el ratón: arrastra desde el punto gris del borde derecho de “Entrada A” hasta “Entrada B” (se rechaza, sin ningún aviso) o hasta “Salida” (se acepta).
- Por código: los dos botones bajo el diagrama llaman directamente a
model.addLink(...)— uno con un enlace válido, otro con uno inválido — para que veas la diferencia de comportamiento frente al arrastre.
model.isValidNode = (nodeData) => boolean;model.isValidLink = (linkData) => boolean; // linkData tiene { from, to, ... }La regla de este ejemplo: solo se aceptan enlaces de un nodo kind: 'input'
a uno kind: 'output' (nunca input→input, output→output, ni auto-enlaces).
Interactivo vs. programático
Sección titulada «Interactivo vs. programático»Arrastrando (LinkingTool) |
Por código (model.addLink) |
|
|---|---|---|
| Si es válido | Se crea el enlace, se dispara LinkDrawn |
Se crea, sin más |
| Si es inválido | No pasa nada — no se crea, no hay evento, no hay error | Lanza una excepción (Error: Link validation failed) |
Esa fila de “si es inválido” es la parte que conviene recordar: al arrastrar,
una regla que rechaza el enlace es silenciosa (ideal para el usuario,
pero fácil de no notar mientras desarrollas); al llamar a model.addLink(...)
directamente, una regla que rechaza el enlace lanza, así que hace falta
envolver la llamada en un try/catch si esperas que pueda rechazarse.
diagram.commit(fn) no atrapa esa excepción por ti — usa
try { ... } finally { ... } internamente, así que la transacción se cierra
igual, pero la excepción sigue propagándose fuera de commit(...). Si quieres
manejarla, el try/catch tiene que envolver la llamada a addLink (dentro o
fuera del commit), no sustituirlo.
También existen isValidNodeRemoval / isValidLinkRemoval con la misma
forma, para impedir borrados en vez de altas.
El punto gris es un portId, no decoración
Sección titulada «El punto gris es un portId, no decoración»El pequeño círculo del borde derecho de cada nodo no es solo un detalle
visual: LinkingTool solo empieza a arrastrar un enlace nuevo si el punto
donde presionas el ratón cae sobre un elemento con un portId declarado
(no vacío) — no basta con presionar “en cualquier parte del nodo”. Si ningún
elemento de la plantilla tiene portId, arrastrar para crear un enlace
simplemente no hace nada, sin ningún error que lo delate:
$(go.Shape, 'Circle', { portId: 'out', // obligatorio y no vacío — activa el arrastre desde aquí width: 10, height: 10, alignment: go.Spot.Right,}),