Jgplot-каким-то образом строятся предыдущие данные массива?
Итак, это мой первый Форрей в Javascript на самом деле, и здесь или там есть странная часть, потому что мы имеем дело с HMI для DCS. Но я не верю, что проблема, с которой я сталкиваюсь, имеет какое-то отношение к этому, я думаю, что каким-то образом я просто что-то испортил с javascript, и это вызывает у меня здесь большую головную боль.
У меня есть код, который считывает данные переменных тегов массива из DCS, чтобы отобразить эти данные массива на экране в HMI для оператора. Кажется, все работает нормально, за исключением пары действительно странных вещей. Когда я впервые загружаю страницу, сценарий запускается (я использовал предупреждения, чтобы подтвердить, что код обрабатывается), но график не отображается. Когда я выбираю другой профиль, скрипт запускается снова и график загружается, но отображаемые данные массива относятся к предыдущему графику, что не имеет смысла, потому что эти данные массива должны быть перезаписаны (насколько я понимаю) и Переменная заголовка показывает правильные / новые данные, что также подтверждает правильность переменных тегов, которые она должна считывать в массив. Таким образом, кажется, что даже если код запускается во второй раз, он каким-то образом просто показывает предыдущий график вместо загрузки нового графика с новыми данными графика. Вот рассматриваемый код:
function buildProfile(titleText){ alert("buildProfile Script is running, titleText variable was passed as " + titleText); var profileSeries = [], profileArr = [], count = 0, size = 840; while (count < size){ profileArr[count] = ProfileData.DataValue("CmNameProfile.PROFILEA.DATAARRAY[" + count + "]"); count++; if (count < 1){ alert("While Loop Started"); }; if (count > 839){ alert("While Loop Finished"); }; }; alert("While Loop Complete? If so this value should be in the proper range for profile selected. The value is " + profileArr[50]); profileSeries.push(profileArr); var optionsObj = { title:titleText, axes:{xaxis:{min:0, max:840}}, seriesDefaults:{color:'#00ff00', lineWidth:2, showMarker:false}, grid:{background:'#000000', gridLineColor:'#aaaaaa', shadow:false}, canvasOverlay:{show:true, objects:[{horizontalLine:{name:'setpoint', y:15, lineWidth:2, color:'#ffffff', shadow:false}}]} }; plot1 = $.jqplot('plotDiv', profileSeries, optionsObj).replot(); }
Что я уже пробовал:
Итак, я обновил приведенный выше код. Таким образом, при начальной загрузке страницы сценарий while не выполняется. Но тогда это произойдет, если я вызову сценарий во второй раз. Так вот почему профиль не отображается, никаких данных в массиве нет. Почему бы циклу while не работать?!?
Karthik_Mahalingam
почему вы используете
$(document).ready(function(){внутри функции?
ottomation
Я думал, что это должно было обеспечить окончательную загрузку документа и целевого div перед вызовом графика для рендеринга. По-моему, я действительно пытался это прокомментировать и не увидел никакой разницы. Я могу попробовать еще раз, чтобы убедиться.
edit: да, комментирование этих строк, похоже, не имеет никакого влияния. Думаю, тогда я смогу просто убрать это.
edit2: для меня это просто не имеет никакого смысла. Это похоже на то, как если бы график вызывался перед запуском цикла while для перестроения массива с новыми данными. Я просто попытался полностью отделить вызов сюжета в совершенно отдельную функцию и вызвать ее после выполнения цикла while, и все же она по-прежнему делает то же самое. Я совершенно сбит с толку здесь.
edit3: я имею в виду, что цикл while должен завершиться до того, как остальная часть кода после него в функции выполнится правильно? Или не в JavaScript работают по-другому, чем я предполагаю, что каким-то образом?