У меня есть график svg с несколькими различными типами узлов, причем каждый тип имеет много разных узлов с разным назначением.
Продукты, сообщества, события, проекты, группы продуктов.
Я хочу установить фоновые изображения каждого узла.
Каждый отдельный узел каждой из этих групп имеет свой уникальный идентификатор.Тип и идентификатор этих узлов можно использовать для получения изображения из конечной точки для всех типов, кроме групп продуктов, изображения которых находятся в папке ресурсов.
Я пытаюсь вызвать изображения из 1. конечных точек и 2. из папки ресурсов.
Мои конечные точки представляют различные типы и имеют идентификаторы, проанализированные в:
https://tiktok.org/products/${node.id}/standard
https://tiktok.org/communities/${node.id}/standard
Мой текущий метод выполнения этого кажется Чрезвычайно неэффективным, и яя не должен дублировать код!Я «добавляю» svg-изображение и ID, затем я ссылаюсь на них для node.types и анализирую их ID, но это просто загрузка кода (вот два типа в качестве примера):
.selectAll('circle.node')
.data(this.nodes)
.enter();
//products
circle
.filter(node => node.type === EngagementType.Product)
.append("pattern")
.attr("id", d => `insightImage-${d.id}`)
.attr("patternContentUnits", "objectBoundingBox")
.attr("width", "100%")
.attr("height", "100%")
.attr("x", 0)
.attr("y", 0)
.append("image")
.attr("xlink:href", d => `https://tiktok.org/products/${d.id}/standard`) (fake link)
.attr("x", 0)
.attr("y", 0)
.attr("width", 1)
.attr("height", 1)
.attr('preserveAspectRatio', 'xMidYMid slice');
//communities
circle
.filter(node => node.type === EngagementType.Community)
.append("pattern")
.attr("id", d => `insightImageCom-${d.id}`)
.attr("patternContentUnits", "objectBoundingBox")
.attr("width", "100%")
.attr("height", "100%")
.attr("x", 0)
.attr("y", 0)
.append("image")
.attr("xlink:href", d => `https://tiktok.org/communities/${d.id}/standard`)
.attr("x", 0)
.attr("y", 0)
.attr("width", 1)
.attr("height", 1)
.attr('preserveAspectRatio', 'xMidYMid slice');
ЗатемЯ заполняю круг атрибутом стиля, как показано ниже:
circle
.filter(node => node.depth !== 0 && node.type === EngagementType.Product)
.append('circle')
.classed('Engagement-GraphNode', true)
.classed('Engagement-GraphNodeBackground', true)
.classed('Engagement-GraphLeaf', node => node && (node.depth === 4 && !node.isExtraNode))
.style('fill', d => `url(#insightImage-${d.id})`)
.style('opacity', node => (node.visible) ? 1 : 0)
.style('visibility', node => (node.visible) ? 'visible' : 'hidden')
.on('click', node => onClick(node));
circle
.filter(node => node.depth !== 0 && node.type === EngagementType.Community)
.append('circle')
.classed('Engagement-GraphNode', true)
.classed('Engagement-GraphNodeBackground', true)
.classed('Engagement-GraphLeaf', node => node && (node.depth === 4 && !node.isExtraNode))
.style('fill', d => `url(#insightImageCom-${d.id})`)
.style('opacity', node => (node.visible) ? 1 : 0)
.style('visibility', node => (node.visible) ? 'visible' : 'hidden')
.on('click', node => onClick(node));
У меня есть аналогичный метод для изображений в папке активов, у меня есть куча images.svg, а затем сделать то же самое, что и выше длягруппа продуктов, но на самом деле их называют индивидуально, занимая МАССЫ пространства ...
, в этом случае я вызываю узлы через их ID, чтобы индивидуально назначить изображение из папки ресурсов:
circle
.filter(node => node.type === EngagementType.ProductGroup && node.id === 'a6qb000000003olAAA')
.append("pattern")
.attr("id", `insightImageInitiative`)
.attr("patternContentUnits", "objectBoundingBox")
.attr("width", "100%")
.attr("height", "100%")
.attr("x", 0)
.attr("y", 0)
.append("image")
.attr("xlink:href", './assets/d3-icons/initiative.svg')
.attr("x", 0.2)
.attr("y", 0.2)
.attr("width", 0.60)
.attr("height", 0.60)
.attr('preserveAspectRatio', 'xMidYMid slice');
circle
.filter(node => node.type === EngagementType.ProductGroup && node.id === 'a6qb000000003okAAA')
.append("pattern")
.attr("id", `insightImageIndustry`)
.attr("patternContentUnits", "objectBoundingBox")
.attr("width", "100%")
.attr("height", "100%")
.attr("x", 0)
.attr("y", 0)
.append("image")
.attr("xlink:href", './assets/d3-icons/industry.svg')
.attr("x", 0.2)
.attr("y", 0.2)
.attr("width", 0.60)
.attr("height", 0.60)
.attr('preserveAspectRatio', 'xMidYMid slice');
Я пытался просто использовать стиль (заливка), но у меня это не сработало бы !!
.style('fill', d => `url('./assets/d3-icons/calendar.svg')`)
.style('fill', d => `url('https://tiktok.org/products/${d.id}/standard')`)
ничего не появляется!
Несколько советов / справок о том, как по-разному устанавливать изображения ИЛИ какизбавиться от такого большого количества дубликатов было бы замечательно!
Я уверен, что есть более простой способ установить фоновые изображения, конечно, конечные точки отличаются, хотя.
спасибо, если вы можете помочь!