#javascript #d3.js #scxml
#javascript #d3.js #scxml
Вопрос:
Я работаю с SCXML, и мои данные выглядят примерно так:
<state id="umbrella_state">
<state id="state1"></state>
<state id="state2>
<transition event="cancel"></transition>
<transition event="next"></transition>
</state>
<transition event="quit"></transition>
</state>
Я использую D3 с целью визуализации состояния и его переходов, но я изо всех сил пытаюсь точно выбрать только нужные переходы.
d3.selectAll("#transitions") // selects everything, which I don't want
Я хочу выбирать только переходы для состояния, а не его дочерние состояния. Например, единственным переходом для состояния 1 является «выход». Я представляю себе что-то вроде:
d3.selectAll("[id=umbrella_state]").selectAll("transition :not(transition > transition)")
(и повторяйте это для каждого родительского состояния, пока я не достигну желаемого состояния).
Ответ №1:
Согласно документам API, select должен получать только первый элемент, который соответствует его условию выбора, а не каждый элемент.
Кроме того, согласно документам API, селекторы d3 используют стандарт CSS3, поэтому что-то вроде этого
d3.select("state ~ transition")
Следует выбирать только первый переходный брат после элемента состояния. ( ~
символ обозначает родственный элемент, который следует в какой-то момент после первого селектора, подробнее здесь ) К сожалению, нет селектора CSS3 для родственных элементов, которые предшествуют единице.
Надеюсь, это поможет.
Комментарии:
1. Упс, я исправил использование select на selectAll . Спасибо за совет, я думаю, что смогу использовать выбор атрибута с этим.
Ответ №2:
Я решил свою проблему с помощью такого селектора:
d3.selectAll("[id='" state.attr("id") "'] > transition")
Что переводится как что-то вроде:
d3.selectAll("[id='umbrella_state'] > transition")
Я делал это рекурсивно для каждого уровня, пока не достиг самого глубокого состояния.