график должен быть перерисован каждый раз, когда добавляются новые данные или изменяются параметры.
function addPrenotazione() {
dataTable.addRows(["Tavolo" + $("#tavolo").val(), new Date($("#datainizio").val()), new Date($("#datafine").val())]);
chart.draw(dataTable, options);
}
переместите указанную выше функцию в функцию drawChart
,
это позволит функции получить доступ к переменным dataTable
и chart
...
onclick="addPrenotazione"
, вместо этого добавьте событие и внутри функции drawChart
...
document.getElementById('prenota').addEventListener('click', addPrenotazione); // 'prenota' or whatever the button id is...
finally при изменении элементов диаграммы подождите, пока 'ready'
,
не завершат рисование диаграммы ...
// Function to remove 0 value bars
google.visualization.events.addListener(chart, 'ready', function () {
var el = container.getElementsByTagName("rect");
var width = 100000000;
var elToRem = [];
for (var i = 0; i < el.length; i++) {
var cwidth = parseInt(el[i].getAttribute("width"));
if (cwidth < width) {
elToRem = [el[i]];
width = cwidth;
}
else if (cwidth == width) {
elToRem.push(el[i]);
}
}
for (var i = 0; i < elToRem.length; i++)
elToRem[i].setAttribute("fill", "none");
});
рекомендуем настроить аналогично следующему ...
[ 114] вам нужно будет привести даты в соответствие формату исходных данных,
с нулем, использованным для года.
function addPrenotazione() {
var dateBeg = new Date($("#datainizio").val());
var dateEnd = new Date($("#datafine").val());
dataTable.addRow(["Tavolo" + $("#tavolo").val(), new Date(0, 0, 0, dateBeg.getHours(), dateBeg.getMinutes(), dateBeg.getSeconds()), new Date(0, 0, 0, dateEnd.getHours(), dateEnd.getMinutes(), dateEnd.getSeconds())]);
chart.draw(dataTable, options);
}
Общая идиома для очистки стандартных контейнеров подкачивает с пустой версией контейнера:
void clear( std::queue<int> &q )
{
std::queue<int> empty;
std::swap( q, empty );
}
Это - также единственный способ фактической очистки памяти, сохраненной в некоторых контейнерах (станд.:: вектор)
Да - что-то вроде ошибки класса очереди, по моему скромному мнению. Это - то, что я делаю:
#include <queue>
using namespace std;;
int main() {
queue <int> q1;
// stuff
q1 = queue<int>();
}
Автор темы спросил, как "эффективно" очистить очередь, поэтому я предполагаю, что он хочет большей сложности, чем линейная O(размер очереди). Методы, обслуживаемые Дэвидом Родригесом, аноном, имеют одинаковую сложность:
согласно ссылке STL, оператор =
имеет сложность O(размер очереди).
ИМХО, потому что каждый элемент очереди резервируется отдельно, а не выделяется в один большой блок памяти, как в векторе. Итак, чтобы очистить всю память, мы должны удалить каждый элемент отдельно. Таким образом, самый простой способ очистить std::queue
— это написать одну строку:
while(!Q.empty()) Q.pop();