Есть ли какой-либо пример или пример кода для функции поиска и фильтрации в Cytoscape JS - PullRequest
0 голосов
/ 15 апреля 2020

Я видел в приложении cytoscape у нас есть такие функции, как поиск и фильтрация по ключевым словам и степени. Я попробовал обходной путь, следуя оригинальным документам. Здесь вы можете увидеть демонстрационную версию webdemo.intolap.com/cytoscape (view-source для исходного кода или фрагмента). Фильтр работает хорошо частично. Например, «яблоко» будет отображать яблоко и связанные с ним узлы (1-й уровень) именно то, что я ищу.

Но проблема, с которой я сталкиваюсь, заключается в сбросе графика и повторной фильтрации с другим ключевым словом. Кажется, функция фильтра не работает после того, как текстовое поле очищено, а затем введено другое ключевое слово.

Я имею в виду, когда я очищаю текстовое поле, он сбрасывает график на исходный, что является правильным. Я сделал это с помощью функции init (), которая восстанавливает график. Но тогда, если я ищу "Ball", фильтр не работает. Любая помощь, пожалуйста. Спасибо!

Ответы [ 2 ]

3 голосов
/ 15 апреля 2020

на самом деле есть достаточно хорошее объяснение в официальных документах здесь , но, если честно, я тоже сначала боролся с этой функцией:

В принципе, вы можете отфильтровать специфику c Коллекция, которую вы хотите найти, просто вставив фильтр запроса. Поэтому, если вы хотите отфильтровать все узлы, вы можете использовать это:

cy.nodes(filterQuery);

Если вы хотите отфильтровать все элементы, просто вызовите это:

cy.elements(filterQuery);

Если вы хотите сделать это просто, вы можете использовать эту короткую версию (сокращение от cy.filter(...)):

cy.$(filterQuery);

Сам запрос фильтра не так сложен, вы можете сделать это (при условии, что сначала у вас есть узел с идентификатором) "или такой атрибут, как nodeColor" # 2763c4 "):

cy.$('[id != "first"]');
cy.$('[id = "first"]');
cy.$('[nodeColor = "#2763c4"]');
cy.$('[weight > 50]');

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

cy.$('node[id != "first"]');

Наконец, если вам нужно Сложная фильтрация, вы можете использовать функцию для применения этой логики c к фильтру, для этого просто сделайте это:

cy.$(function(element, i){
  return element.isNode() && element.data('weight') > 50;
});
0 голосов
/ 24 апреля 2020

Похоже, вы пытаетесь cy.filter на экземпляре cytoscape, который больше не существует в этой точке. Вот почему он работает в первый раз, но не во второй раз (после того, как вы восстановите график, что, вероятно, означает уничтожить и создать).

Необходимо убедиться, что вы указали обработчики фильтров на активный экземпляр Cytoscape.

...