Vuejs方法没有开火

时间:2017-08-09 14:27:57

标签: jquery d3.js vue.js vuejs2 dagre-d3

当我从jquery选择器调用vuejs函数时,它不会触发。我在vue组件中集成了d3-dagre图表。当我为节点设置单击操作时,它不会触发vuejs方法。在下面getJobid()没有触发。找到以下vue组件代码以及最后的错误。

Vue组件:

export default {
  name: 'dagView',
  created () {
    console.log('test2')
  },
  mounted () {
     var g = new dagreD3.graphlib.Graph().setGraph({})
     // 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")

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

     inner.selectAll("g.node")
     .on("click", function(v) {
        console.log("Nodes --> "+ v + " -- "+ g.node(v).label)
        this.nodeId = g.node(v).label
        console.log("Node id -- "+ this.nodeId)
        this.getJobid()
     })
  },
  methods: {
    getJobid: function() {
      console.log('Received NodeId')
    }
  }
}

错误:

Uncaught TypeError: this.getJobid is not a function
at SVGGElement.eval (DAG.vue?2ccc:180)
at SVGGElement.__onclick (d3.v3.min.js:1)

4 个答案:

答案 0 :(得分:5)

this处理程序的回调中的on未引用Vue实例。在处理程序外部设置引用并改为使用它:

var self = this 
inner.selectAll("g.node")
  .on("click", function(v) {
    console.log("Nodes --> "+ v + " -- "+ g.node(v).label)
    self.nodeId = g.node(v).label
    console.log("Node id -- "+ this.nodeId)
    self.getJobid()
  })

答案 1 :(得分:4)

最好使用arrow function,以便回调中的this引用Vue实例。

答案 2 :(得分:1)

嗯,这里的问题是“this.getJobid()”实际上不是一个函数 这是指当前的背景 - 在您的情况下

inner.selectAll("g.node").on("click", function(v) {
// as we are inside inner.selectAll('g.node') 
// our Vue instance is not what we will find here
..
}

解决方案是在注册处理程序之前创建对Vue的引用,通常是

const vm = this;

然后你可以尝试

vm.getJobid();

答案 3 :(得分:0)

inner.selectAll("g.node")
  .on("click", (v) => {
    console.log("Nodes --> " + v + " -- " + g.node(v).label)
    this.nodeId = g.node(v).label
    console.log("Node id -- " + this.nodeId)
    this.getJobid()
  })