проблема с всплывающей подсказкой vuejs + dagre-d3

Я пытаюсь интегрировать приведенный ниже график (dagre-d3) в свое приложение vuejs.

http://www.samsarin.com/project/dagre-d3/latest/demo/hover.html

Мне удалось сгенерировать график внутри компонента vuejs. Но я не могу добиться функциональности всплывающей подсказки, представленной на графике. Они используют библиотеку под названием tipy, когда я запускаю график в простом html, он работает нормально. Но когда я использую внутри приложения vue, возникает следующая ошибка.

[Vue warn]: Error in mounted hook: "TypeError: $(...).tipsy is not a function"

found in

---> <DagView> at

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

<script>
  export default {
  name: 'TreeView',
  mounted () {
    /* eslint-disable */
    // Create a new directed graph
    var g = new dagreD3.graphlib.Graph().setGraph({})

    var Tree_JSON = 
    {
        "nodes":
        [
            {
                "label": "start",
                "job_id": "11111"
            },
            {
                "label": "End"
            }
        ],
        "edges":
        [
            {
                "startEdge": "start",     
                "endEdge": "end"
            }
        ]
    }

    var TreeData = Tree_JSON.nodes;
    // Add states to the graph, set labels, and style
    Object.keys(TreeData).forEach(function(key) {
        var value = TreeData[key]
        value.label = TreeData[key].label
        value.rx = value.ry = 5
        g.setNode(TreeData[key].label, value)
    })

    var TreeEdges = Tree_JSON.edges;
    // Add states to the graph, set labels, and style
    Object.keys(TreeEdges).forEach(function(key) {
        g.setEdge(TreeEdges[key].startEdge,  TreeEdges[key].endEdge, { label: ""} )
    })

    // Create the renderer    
    var render = new dagreD3.render()

    // Set up an SVG group so that we can translate the final graph.
    var svg = d3.select("svg"),
    inner = svg.append("g")

    // Set up zoom support
    var zoom = d3.behavior.zoom().on("zoom", function() {
        inner.attr("transform", "translate(" + d3.event.translate + ")" +
                                    "scale(" + d3.event.scale + ")")
    })
    svg.call(zoom)

    // Simple function to style the tooltip for the given node.
    var styleTooltip = function(name, description) {
    return "<p class='name'>" Test label "</p><p class='description'>" Desc "</p>"
    }

    // Run the renderer. This is what draws the final graph.
    render(inner, g)

     inner.selectAll("g.node")
    .attr("title", function(v) { 
        return styleTooltip(v, "Execution Time: "+g.node(v).label + " <br /> Description: "+g.node(v).label) 
    })
    //.each(function(v) { $(this).tipsy({ gravity: "w", opacity: 1, html: true }) })

    inner.selectAll("g.node")
    .on("click", function(v) {
        console.log("Nodes --> "+ v + " -- "+ g.node(v).label)
        // whatever
    })

    // Center the graph
    var initialScale = 1.2
    zoom
    .translate([(svg.attr("width") - g.graph().width * initialScale) / 50, 20])
    .scale(initialScale)
    .event(svg)
    svg.attr('height', g.graph().height * initialScale + 40)
    svg.attr('width', g.graph().width * initialScale + 40)
 }
 }


person krrr25    schedule 08.08.2017    source источник
comment
Как вы интегрируете это в vue? Включите код vue, который показывает график.   -  person Luis Orduz    schedule 08.08.2017
comment
@LuisOrduz обновил полный код.   -  person krrr25    schedule 09.08.2017


Ответы (1)


Tipsy — это плагин для jQuery. "TypeError: $(...).tipsy is not a function" означает, что в объекте jQuery нет функции с именем tipsy. Попробуйте включить плагин после jQuery и перед вашим скриптом.

Если вы используете vue-loader и webpack, установите tipy с npm install jtipsy --save и попробуйте следующее:

import $ from 'jquery'
require('jtipsy')

export default {
  name: 'TreeView',
  mounted () {
    // Your code here
  }
}

person Antonio Trapani    schedule 09.08.2017
comment
я пытался включить после jquery, но все равно не работает - person krrr25; 09.08.2017
comment
попробуйте запустить свой код при загрузке DOM, обернув ваш код внутри $(function() { ... }) и, конечно же, не забудьте удалить комментарий из строки //.each(function(v) { $(this).tipsy({ gravity: "w", opacity: 1, html: true }) }) - person Antonio Trapani; 09.08.2017
comment
Ответ отредактирован, чтобы показать, как включить типси при использовании vue-loader и webpack. - person Antonio Trapani; 09.08.2017
comment
Trapni - Разница версий не повлияет? В любом случае попробуем ваш подход и обновим вас. - person krrr25; 10.08.2017
comment
Я устал, как показано ниже, пока он не работает. global.jQuery = require('jquery') window.$ = require('jquery') require('jtipsy') $(document).ready(function() { $('a[rel=tipsy]').tipsy ({исчезновение: истина, гравитация: 'n', тень: истина, shadowBlur: 10, shadowOpacity: 1, shadowSpread: 1}); }); Вышеприведенное по-прежнему выдает ошибку jQuery.Deferred exception: $(...).tipsy не является функцией TypeError: $(...).tipsy не является функцией - person krrr25; 10.08.2017
comment
Я использую vue-loader и webpack, я попробовал свой код, и он работает очень хорошо. Пожалуйста, дайте мне ссылку на репозиторий, который воспроизводит проблему. - person Antonio Trapani; 10.08.2017
comment
К сожалению, у меня нет репозитория, я работаю локально. - person krrr25; 10.08.2017
comment
Если вы не предоставите дополнительный код или репозиторий, воспроизводящий проблему, ее действительно сложно отлаживать. - person Antonio Trapani; 10.08.2017
comment
Хорошо, постараюсь поделиться дополнительным кодом. Можете ли вы поделиться своим репозиторием проекта, чтобы я мог попробовать и ваш подход. - person krrr25; 10.08.2017
comment
Я только что создал репозиторий с примером: github.com/TwistedLogic/vuejs-tipsy-example . Наслаждаться ;) - person Antonio Trapani; 11.08.2017