我试图将鼠标悬停在动态创建的LineSeries上。创建LinesSeries之后,我将信号处理程序附加到悬停的事件上。

问题是:
从下面的简化示例中,当我将鼠标悬停在LineSeries上时,它会打印出最后添加的LineSeries的名称。什么时候应该打印添加的每个LineSeries的系列名称。
例如,如果创建的3个LineSeries的名称为[“ Line A”,“ Line B”,“ Line C”],则将鼠标悬停在每个LineSeries上时,应打印每个对应的名称,而对所有3个都打印“ Line C” LineSeries悬停的事件处理程序。我在做什么
错误?

//dataset is a dictionary(QVariant) of items where each item is the name of the line series
for(var name in dataset) {
        var series = chart.createSeries(ChartView.SeriesTypeLine, name, xAxis, yAxis);
        series.name = name;

        series.hovered.connect(
                    function (point,state){
                        if (state){
                            console.log(">>>"+ name); // <- should print the name of each series
                        }

                    });


我感觉这与将name变量的当前值绑定到onhovered事件处理程序有关,但是我不确定如何执行此操作。我知道在普通的JS中,它们会像

functionName.bind({... code ...},this);

谢谢你的帮助。

--E

最佳答案

name包含迭代完成时数组的最后一个值,因此连接处理程序将始终采用该值。为了避免这种行为,您应该使用闭包,如下所示:

    Component.onCompleted: {
        var dataset = ["aaa","bbb","ccc"];

        for(var name in dataset) {
            var series = chart.createSeries(ChartView.SeriesTypeLine, dataset[name], xAxis, yAxis);

            (function(series){
                series.name = dataset[name];
                series.hovered.connect(function (point, state)
                {
                    if (state)
                    {
                        console.log(series.name);
                    }
                });
            })(series);

        }
    }

10-04 16:50