XsltListViewWebPart lembrando o estado no cookie não funcionando corretamente
-
09-12-2019 - |
Pergunta
Eu tenho um XsltListViewWebpart que mostra uma estrutura em árvore com nós.Fiz um script jquery que define um cookie que persiste o estado dos nós (expandidos/recolhidos) entre postbacks.
Eu adicionei o script com:
_spBodyOnLoadFunctionNames.push("RestoreClickedState");
...para que o script seja o último a ser executado na página.
O problema é que obtenho resultados inconsistentes:
entre o postback e meu script, há outra coisa que recolhe os nós:por exemplo, se eu expandir um nó e deixar 9 fechados, após o postback meus 9 nós serão fechados, mas meu expandido também será fechado e não consigo entender o porquê.
Para outros nós, se eu expandir um nó e deixar os outros recolhidos, às vezes, após o postback, outro nó será expandido incorretamente em vez do correto.
Aqui está meu roteiro:
<script>
$(window).unload(function()
{
RememberClickedState();
});
var items = '';
function RememberClickedState() {
$('.ms-listviewtable tbody[id^="tbod"]').each(function(){
tid = $(this).attr('id');
tvisible = ($(this).attr('style') == undefined ||
$(this).attr('style').indexOf('display: none;') == -1);
items += tid+':'+tvisible+','
})
$.cookie("itemListState", items);
}
function RestoreClickedState() {
//alert("beginne");
string = $.cookie("itemListState");
//alert(string);
var cookies = string.split(',');
//alert(cookies.length);
$.each(cookies, function(i, val){
val = val.split(':');
show = (val[1] == 'true' ? true:false);
var test = val[0].substring(val[0].length -1, 1);
var thisID = test.replace("bod", "");
var thisImgID = "img_" + thisID;
if(!show && thisID)
{
//alert(thisID + " - " + thisImgID + " hiding");
ExpCollGroup(thisID, thisImgID);// ,null, show);
}
});
//$.cookie("itemListState", null);
}
_spBodyOnLoadFunctionNames.push("RestoreClickedState");
</script>
Quando utilizo o alerta para verificar o conteúdo dos cookies após cada postback, ele mostra corretamente todos os cookies, então a parte do cookie do script está funcionando, mas a expansão/recolhimento de acordo com o cookie não.
Alguém tem alguma ideia, porque estou lidando com isso há cerca de 4 dias.
Muito obrigado antecipadamente.
Atenciosamente, Andrei
EDIT acabei de perceber que tudo funciona, exceto para o SEGUNDO postback.portanto, no primeiro postback após a criação do cookie, os nós são lidos corretamente do cookie, mas expandidos/recolhidos incorretamente, mas no postback seguinte, os nós são expandidos/recolhidos corretamente.o que me leva a acreditar que de alguma forma há um problema com _spBodyOnLoadFunctionNames.push.
não pode ser um problema com o outro evento $(window).unload porque os cookies são lidos corretamente, então o primeiro evento funciona conforme o esperado.
editar 30.07.2012:
Tentarei ser mais claro sobre o treeview.Por "treeview", quero dizer, o componente em si é um WebPartPages:XsltListViewWebPart e, sim, esta é uma visualização padrão, com opções de agrupamento.Por favor, deixe-me saber se mais informações são necessárias.
Solução
Supondo que você usou as opções de agrupamento padrão disponíveis nas listas do SharePoint:O SharePoint já possui esse comportamento de memorização integrado e você o está duplicando.
Aqui está o que poderia acontecer:
- quando a página é carregada, o SharePoint expande o nó porque este é o estado armazenado
- seu script faz a mesma interpretação e o recolhe de volta
Aqui está o que você pode tentar:
- remova seu script e veja se o comportamento padrão é exatamente o que você precisa
- em vez de um script que alterna estados (ExpCollGroup), escreva um script que defina explicitamente o estado como expandido ou recolhido.Dessa forma, não há risco de troca dupla.