当我从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)
答案 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()
})