[英]Object-method callback loses its binding in an event handler when passed as a parameter, but not when hard-coded
[英]Javascript hard-coded object works as parameter, but not reference to global object
我在JQuery Flot中遇到了一個奇怪的問題。
我一直在跑步
var plot = null;
function initPlot () {
plot = $.plot("#graph", myData, { /* my options here */ });
}
而且一切正常。
我將選項數據移到了函數范圍內的變量中
var plot = null;
function initPlot () {
var myOptions = { /* my options here */ };
plot = $.plot("#graph", myData, myOptions);
}
再次,一切正常。
然后,我將該變量移至更廣的范圍(以便可以在其他函數中引用它)。
var plot = null;
var myOptions = { /* my options here */ };
function initPlot () {
plot = $.plot("#graph", myData, myOptions);
}
突然無法正確繪制。 更讓我感到困惑的是,它獲取了大多數選項的值-出現了圖形,而不是數據。
使用Chrome的調試器,我可以在調用$.plot()
時看到myOptions
具有正確的值。 我也試着設置一個局部變量o = myOptions
並調用$.plot()
與o
代替myOptions
,但是這也不能繪制數據。
是什么原因造成的,我該如何解決?
我應該注意,我正在使用Flot.Grow和Flot.Stack,但是禁用這些不會改變結果。
再次編輯
根據注釋,這實際上是我的代碼的狀態:
<body>
<div id="graph" style="width: 100%; height: 800px;"></div>
<script>
var idMap = {};
var yesData = [];
var noData = [];
var incData = [];
var voteData = [{ label: "Yes votes", data: yesData },
{ label: "No votes", data: noData },
{ label: "Not met quorum", data: incData }];
var ticks = [];
var plot = null;
var myOptions = {
series: {
//stack: true,
lines: {
show: false,
fill: true,
steps: false,
},
bars: {
show: true,
barWidth: .8,
horizontal: true,
},
//grow: {
// active: false,
// steps: 20,
// stepDirection: "up",
// stepMode: "linear",
// valueIndex: 0,
// growings: [{
// valueIndex: 0,
// }]
//},
},
yaxis: {
min: -.2,
max: 10, //dictLen(idMap),
//ticks: ,
//tickLength: 0,
},
xaxis: {
min: 0,
max: 200,
},
grid: {
hoverable: true,
},
};
function dictLen(obj) {
var size = 0, key;
for (key in obj) {
if (obj.hasOwnProperty(key)) size++;
}
return size;
};
function setDataPoint(val) {
var total = val.r["yes"] + val.r["no"];
if (total < val.q) {
incData.push([total, idMap[val.id]]);
}
else {
yesData.push([val.r["yes"], idMap[val.id]]);
noData.push([val.r["no"], idMap[val.id]]);
}
}
function initData() {
$.getJSON('/Vote/results', function (data) {
$.each(data, function (key, val) {
idMap[val.id] = key;
ticks.push([key + .4, val.nm]);
setDataPoint(val);
});
initPlot();
});
}
function initPlot() {
plot = $.plot("#graph", voteData, myOptions);
}
$(document).ready(function () {
initData();
});
</script>
</body>
原來我有點白痴。
問題是我在填充idMap
之前正在計算myOptions.yaxis.max
。 然后,當我在這里等待答案時,我在數據庫端進行了一些重構,從而導致數據集為空。
當我修復數據庫並將myOptions
設置為僅靜態值時,它工作正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.