jsPlumb с соединением Angular 5+ Drag&Drop

Я борюсь с выпуском jsPlumb Community, чтобы соединить элементы с помощью мыши с помощью Drag & Drop.

Я пытаюсь сделать поток элементов, связанных пользователем, и экспортировать в Json.

посмотрите: https://stackblitz.com/edit/angular-jsplumb-test-rx8hdy< /а>

Спасибо за помощь !!


person CristiC777    schedule 01.08.2019    source источник
comment
jsplumb.github.io/jsplumb/draggable-connections-examples.html   -  person CristiC777    schedule 01.08.2019


Ответы (1)


Основная проблема здесь в том, что вы создаете новый экземпляр jsPlumb для каждого нового узла. Узлы не могут быть связаны друг с другом, если они из разных экземпляров jsPlumb.

Таким образом, решение состоит в том, чтобы использовать один экземпляр jsPlumb, например, я создал один экземпляр в NodeService:

@Injectable()
export class NodeService {

  jsPlumbInstance = jsPlumb.getInstance(); 
  ...

}

Пример Stackblitz

введите описание изображения здесь

Чтобы экспортировать вашу блок-схему в json, я бы посоветовал вам установить uuid для каждой добавляемой вами конечной точки:

this.jsPlumbInstance.addEndpoint(id, { anchor: 'Bottom', uuid: id + '_bottom' }, Endpoint1);
                                                          /\
                                                        this one

Таким образом, вы сможете восстановить все связи, которые вы создали на графике, с помощью метода:

jsPlumbInstance.connect({ uuids: connection.uuids });

Все, что вам нужно сделать, это сохранить json, который состоит из двух частей:

  • узлы
  • связи

узлы-контейнер.component.ts

saveNodeJson(){
    //save element position on Canvas and node conections

    const container = this.viewContainerRef.element.nativeElement.parentNode;
    const nodes = Array.from(container.querySelectorAll('.node')).map((node: HTMLDivElement) => {
      return {
        id: node.id,
        top: node.offsetTop,
        left: node.offsetLeft, 
      }
    });

    const connections = (this.nodeService.jsPlumbInstance.getAllConnections() as any[])
        .map((conn) => ({ uuids: conn.getUuids() }));

    const json = JSON.stringify({ nodes, connections });

    console.log(json);
  }

После того, как вы сохранили json, вы можете восстановить состояние:

узлы-контейнер.component.ts

this.nodes.forEach(node => {
  this.nodeService.addDynamicNode(node);
});

setTimeout(() => { // we need it to make sure all nodes have been rendered
  this.connections.forEach(connection => {
    this.nodeService.addConnection(connection);
  });
})

где метод addConnection:

node.service.ts

addConnection(connection) {
  this.jsPlumbInstance.connect({ uuids: connection.uuids });
}

Пример Stackblitz

person yurzui    schedule 04.08.2019
comment
на Stackblitz работает как шарм, в моем проекте в nodes-container.component.ts at @ViewChild('nodes', { read ; ViewContainerRef }) viewContainerRef: ViewContainerRef =====›› Аргумент типа '{ read: typeof ViewContainerRef; }' нельзя присвоить параметру типа '{ read?: any; статический: логический; }'. Свойство 'static' отсутствует в типе '{ read: typeof ViewContainerRef; }', но требуется в типе '{ read?: any; статический: логический; }'. - person CristiC777; 05.08.2019
comment
на Stackblitz используется Angular 5, потому что я не могу обновить ЗАВИСИМОСТИ core-js, в моем проекте у меня есть Angular: 8.1.1 и typescript: 3.4.3 - person CristiC777; 05.08.2019
comment
Попробуйте добавить свойство ngstatic, @ViewChild('nodes', { read: ViewContainerRef, static: true }) viewContainerRef: ViewContainerRef; - person yurzui; 05.08.2019
comment
Разве статика не должна быть false ? - person An-droid; 14.08.2019
comment
Теперь я застрял в удалении узла и увеличении масштаба :)) Любая идея ?? @An-droid работает со static:true. - person CristiC777; 14.08.2019
comment
@yurzui Возможно ли, что созданный узел нельзя перетаскивать? Например, настроить список узлов по умолчанию и задать им положение, перетаскивать можно будет только линию между их точками. - person String Name; 29.04.2021