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.

Foi útil?

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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top