ottomation Ответов: 1

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 работают по-другому, чем я предполагаю, что каким-то образом?

1 Ответов

Рейтинг:
1

ottomation

Итак, я установил задержку в 1 секунду для своей функции, и теперь она, похоже, отлично работает при загрузке страницы и каждом последующем вызове. Я думаю, что это удовлетворит мои потребности, и у меня почти нет времени на этот проект, так что пока придется обойтись этим. :)