Привет всем, наткнулся на проблему, никак не могу решить.
Ситуация такая:
Есть несколько HTML страниц, на некоторых из них присутствует одинаковая таблица (данные в ней так же общие).
При переходе на другую страницу приходится заново заполнять эту таблицу, что не есть хорошо (строки содержат дополнительные элементы, модифицируемые при создании в зависимости от данных).
Решил грузить один раз эту таблицу и вставлять в нужные страницы. Для этого наследовался от dom::element и добавил функции создания и вставки:
//Первая страница создает list из html - ресурса
void Create(HELEMENT hContainer)
{
htmlayout::dom::element container = hContainer; //<div> куда вставляем таблицу
PBYTE pb;
DWORD cb;
if (GetHtmlResource(L"list", pb, cb, _Module.GetModuleInstance()))
{
container.set_html(pb, cb, SIH_INSERT_AT_START);
HELEMENT list = container.get_element_by_id(L"list");
set(list);
//сохраним шаблон для строки
htmlayout::dom::element field = child(1);
htmlayout::dom::element row = field.child(0);
row_template = row.clone();
row.destroy();
}
}
//Следующие таблицы передают элемент, в который нужно вставить уже созданную таблицу
void Attach(HELEMENT hContainer)
{
htmlayout::dom::element container = hContainer; //<div> куда вставляем таблицу
container.append(*this);
}
HTML таблицы:
<table id="list">
<thead>
<tr>
<th><strong>Col 1</strong></th>
<th><strong>Col 2</strong></th>
<th><strong>Col 3</strong></th>
<th><strong>Col 4</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>User 1</td>
<td>Russia</td>
<td>
<select class="actionList" type="select-dropdown">
<caption>3</caption>
<div buttons>
<widget type="button" role="dropdown"></widget>
</div>
<popup id="popup">
<option value="0">do somethink</option>
<option value="1">do somethink</option>
<option value="2">do somethink</option>
</popup>
</select>
</td>
<td>comment</td>
</tr>
</tbody>
</table>
Проблема в следующем:
Таблица грузится, элементы добавляются, все хорошо, но при переходе на другую страницу содержимое таблицы либо вообще пропадает, либо элементов становится меньше (от случая к случаю).
Страницы грузятся view с помощью
if(GetHtmlResource(name.c_str(), pb, cb, hInst))
{
m_curHandler->Hide();
HTMLayoutLoadHtml(this->m_hWnd, pb, cb);
m_curHandler = pH;
m_curHandler->Show(); //здесь вызывается Attach() для таблицы, либо Create для первой страницы.
return TRUE;
}
Не знаете в чем может быть проблема? Или как сделать общий элемент для всех страниц?
Здравствуйте, mYziK, Вы писали:
YK>Привет всем, наткнулся на проблему, никак не могу решить.
Что точно предполагается происходить после этого:
row.destroy();
?
Здравствуйте, c-smile, Вы писали:
CS>Что точно предполагается происходить после этого:
CS>CS>row.destroy();
CS>
CS>?
Заполнение и изменение элементов таблицы на разных страницах.
Т.е. делаем клон row_template, заполняем его нужной информацией, меняем внешний вид содержимых элементов и добавляем его в таблицу append()-ом.
Таблица заполняется правильно. Но при переходе некоторые строки теряются.
Здравствуйте, Аноним, Вы писали:
Я спросил что точно делает
row.destroy();
в твоем коде? Зачем оно там?
Здравствуйте, c-smile, Вы писали:
CS>Я спросил что точно делает
CS>CS>row.destroy();
CS>
CS>в твоем коде? Зачем оно там?
в html таблицы есть одна строчка как шаблон всех строк таблицы. Я ее сохраняю отдельным элементом:
row_template = row.clone();
а ее саму удаляю из таблицы
row.destroy();
Потом на основе row_template.clone() добавляю новые элементы таблицы.
Здравствуйте, Аноним, Вы писали:
А>Потом на основе row_template.clone() добавляю новые элементы таблицы.
А что такое child(1) здесь:
htmlayout::dom::element field = child(1);
child кого?
И вот это:
htmlayout::dom::element row = field.child(0);
row_template = row.clone();
row.destroy();
можно заменить на
row_template = field.child(0);
row_template.detach();
Я не сильно понимаю логику но как бы это все должно работать.
Здравствуйте, c-smile, Вы писали:
А>>Потом на основе row_template.clone() добавляю новые элементы таблицы.
CS>А что такое child(1) здесь:
CS>CS>htmlayout::dom::element field = child(1);
CS>
CS>child кого?
CS>И вот это:
CS>CS>htmlayout::dom::element row = field.child(0);
CS> row_template = row.clone();
CS> row.destroy();
CS>
CS>можно заменить на
CS>CS>row_template = field.child(0);
CS>row_template.detach();
CS>
CS>Я не сильно понимаю логику но как бы это все должно работать.
Спасибо, забыл про detach

child(1) — это тело таблицы (header сверстан отдельно). Но это не важно.
А при удалении элемента из дом обязательно всем его чаилдам увеличивать счетчик ссылок?
Я их создаю программно с помощью row_template.clone(), и есть подозрение, что когда я удаляю
таблицу из dom, они уничтожаются и остается только пустая таблица (но иногда пару элементов остается — не постоянное поведение :\)
Буду разбираться.