Cytsocape.js не может создать ребро с несуществующей целью - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь создать ребро после того, как создал узлы с помощью запроса AJAX.

Мой код:

success: function(data) {
    $.each(data['kids'], function(i, value) {
        cy.add({
            group: 'nodes',
            data: { id: value['id'] },
            position: value['position']
        });
    })
}

Это работает и создает узлы.Теперь, используя это, я пытаюсь создать ребро:

cy.add({
    group: 'edges', data: { id: 'e0', source: 'n0', target: 'n1' }
});

, но возвращает:

Невозможно создать ребро e0 с несуществующим источником n0

Невозможно создать ребро e0 с несуществующей целью n1

Ниже мой результат data:

enter image description here

Если я использую этот код, приведенный в качестве примера в документации, все работает:

cy.add([
  { group: "nodes", data: { id: "n0" }, position: { x: 100, y: 100 } },
  { group: "nodes", data: { id: "n1" }, position: { x: 200, y: 200 } },
  { group: "edges", data: { id: "e0", source: "n0", target: "n1" } }
]);

Что я делаю не так?

1 Ответ

0 голосов
/ 11 мая 2018

Лично я не добавляю узлы и ребра отдельно, вы можете использовать массив для сохранения узлов и ребер, которые вы хотите добавить, а затем вызвать cy.add ():

var array = [];
// do your ajax calls
    success: function(data) {
        $.each(data['kids'], function(i, value) {
            array.push({
                group: 'nodes',
                data: { id: value['id'] },
                position: value['position']
            });
        })
    }
// add all edges
array.push({
    group: 'edges', data: { id: 'e0', source: 'n0', target: 'n1' }
});
cy.add(array);

В качестве альтернативыВы можете попытаться использовать cy.ready (), чтобы дождаться фактического добавления узлов, в противном случае может случиться так, что идентификаторы не найдены:

cy.ready(function () {
     cy.add({
          group: 'edges', data: { id: 'e0', source: 'n0', target: 'n1' }
     });
});

Редактировать: Вы вызываете cy.add () для ребер внутри или снаружи вызова ajax?Ajax - это вызов асинхронной функции, поэтому весь код после вызова вне функции success, вероятно, будет выполнен до того, как вы успешно выполните то, что написали.Если вы хотите, вы можете подождать, пока он заработает, и поместить второй cy.add () для ребер в обработчик обещаний, как здесь:

https://blog.revathskumar.com/2016/06/why-i-prefer-ajax-promise.html

...