Gridstack.js: Removendo o widget pai da grade aninhada da última linha da grade principal, fazendo com que alguns dos widgets da grade principal perdessem suas posições

Criado em 4 mai. 2017  ·  6Comentários  ·  Fonte: gridstack/gridstack.js

Oi,

Eu experimentei um comportamento estranho ao redimensionar e remover uma grade aninhada de sua grade pai.

Eu tenho duas grades, uma delas está aninhada no item específico da outra.
É possível adicionar e remover widgets em ambas as grades marcando / desmarcando algumas caixas de seleção.
Quando eu removo widgets da grade aninhada, eu redimensiono seu widget de grade pai para sempre ter no máximo a altura da grade aninhada.
Quando a grade aninhada fica vazia, ela deve ser removida da grade principal.

Na verdade tudo funciona bem até um caso específico:

  1. a grade aninhada está na última linha da grade principal
  2. o redimensionamento da grade aninhada é feito com grid.resize ()
  3. remova o último widget da grade aninhada com gridNested.removeWidget ()
  4. remova o widget pai da grade aninhada da grade principal com grid.removeWidget ().

Quando essas etapas são concluídas, os últimos widgets da grade principal perderam sua posição e pularam para a primeira linha da grade principal - todos os seus atributos de dados permanecem corretos, apenas sua posição fica errada (topo: 0, inferior: altura da grade ) Quando eu adiciono novamente a grade aninhada, tudo volta para a posição correta, mas depois de remover a grade aninhada novamente, a coisa estranha acontece novamente. Uma vez, quando eu executei as etapas acima e tento remover os widgets da grade principal, esses widgets também continuam flutuando para a primeira linha e depois voltam depois de adicionar um widget. Quando eu movo a grade aninhada para qualquer lugar diferente da última linha, o reposicionamento incorreto não acontecerá.

Conforme investiguei, o estranho reposicionamento não acontecerá apenas depois que eu redimensionei uma vez o widget pai da grade aninhada, até que a adição e remoção de widgets em ambas as grades funcione bem. Então parece que o redimensionamento atrapalha as coisas.

Infelizmente, não posso fornecer um violino que funcione, pois isso é apenas uma parte de um script maior, só posso anexar capturas de tela aprovadas de como ele se parece.

Antes de remover a grade aninhada (com bordas):
gridstack2
Depois de remover a grade aninhada, alguns dos outros widgets desapareceram de sua posição original e flutuaram para a primeira linha da grade principal, enquanto seu lugar é mantido na grade na posição correta (espaço em branco vazio na parte inferior):
gridstack3

Minhas grades são inicializadas com estas opções:

grid = $('#grid.grid-stack').gridstack({
            width: 2,
            cellHeight: 84,
            verticalMargin: 4,
            animate: true,
            disableOneColumnMode: true,
            height: 0
}).data('gridstack');        

gridNested = $('#gridNested.grid-stack').gridstack({
            width: 2,
            cellHeight: 80,
            verticalMargin: 4,
            animate: true,
            disableOneColumnMode: true,
            float: true,
            height: 0
}).data('gridstack');

A estrutura HTML é semelhante a esta:

<div id="grid"  class="grid-stack grid-stack-2">
    <div id="element1" class="grid-stack-item element nestedblock" data-id="1" data-gs-width="2" data-gs-height="1" data-gs-min-width="2" data-gs-max-width="2" data-gs-max-height="8" data-gs-y="0" data-gs-x="0">
         <div class="grid-stack-item-content">
             <div id="gridNested" class="grid-stack grid-stack-2">
                 <div id="element20" class="grid-stack-item element" data-id="20" data-gs-width="1" data-gs-height="1" data-gs-min-width="1" data-gs-max-width="2" data-gs-max-height="1" data-gs-y="0" data-gs-x="0">
                     <div class="grid-stack-item-content">
                        <!--contents-->
                    </div>
                </div>
                <div id="element21" class="grid-stack-item element" data-id="21" data-gs-width="1" data-gs-height="1" data-gs-min-width="1" data-gs-max-width="2" data-gs-max-height="1" data-gs-y="0" data-gs-x="1">
                     <div class="grid-stack-item-content">
                        <!--contents-->
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div id="element2" class="grid-stack-item element" data-id="2" data-gs-width="1" data-gs-height="1" data-gs-min-width="1" data-gs-max-width="2" data-gs-max-height="1" data-gs-y="1" data-gs-x="0">
         <div class="grid-stack-item-content">
             <!--contents-->
         </div>
    </div>
    <div id="element3" class="grid-stack-item element" data-id="3" data-gs-width="1" data-gs-height="1" data-gs-min-width="1" data-gs-max-width="2" data-gs-max-height="1" data-gs-y="1" data-gs-x="1">
         <div class="grid-stack-item-content">
             <!--contents-->
         </div>
    </div>
</div>

Eu redimensiono o widget pai da grade aninhada desta maneira:

function resizeNestedParentWidget(){
    var nestedParentWidget = $('#grid .grid-stack-item.nestedblock');
    var nestedGridHeight = parseInt($('#gridNested').attr('data-gs-current-height'));
    var nestedParentWidgetCurrentHeight = parseInt($(nestedParentWidget).attr('data-gs-height'));
    if(nestedGridHeight < nestedParentWidgetCurrentHeight){
        grid.resize(nestedParentWidget,null,nestedGridHeight);
    }
}

Eu removo widgets da grade aninhada desta forma:

![gridstack1](https://cloud.githubusercontent.com/assets/15252130/25693244/9b3f9ac8-30a8-11e7-9621-1c13cfe5acdb.jpg)

var elem = $('#grid #element'+elemID);
gridNested.removeWidget(elem);

if($('#gridNested .grid-stack-item').length < 1){
    grid.removeWidget($('#grid .grid-stack-item.nestedblock'));
} else {
    resizeNestedParentWidget();
}

O que estou fazendo de errado? Eu uso mal alguma coisa? Ou encontrei um bug? :)

Desde já, obrigado.

Comentários muito úteis

Tive o mesmo problema aqui com GridStack 0.3.0, mesmo sem ter grades aninhadas (apenas uma grade simples; porém, o problema só ocorria em configurações específicas de widgets). Posso confirmar que a correção de @carlsch estava funcionando (obrigado!).

No entanto, ao atualizar para GridStack 0.4.0 tudo funciona, mesmo sem o hack. Então, eu sugiro atualizar para 0.4.0 também @PrincessOfSecret e @carlsch.

@radiolips obrigado pela nova versão!

Todos 6 comentários

Ei, @PrincessOfSecret ! Suas capturas de tela parecem muito interessantes!

Obrigado por fornecer todo esse código, mas você poderia montar um jsfiddle com um exemplo do problema? Essa é a maneira mais fácil de verificar o problema e ter certeza de que posso corrigi-lo.

Obrigado pela resposta.

Tentei montar um jsfiddle, mas infelizmente não funcionou
tinha que, porque como eu disse, é uma parte bastante complexa e eu não pude
isole esse problema para ser testado para você. Vou tentar reproduzi-lo em
jsfiddle novamente, mas temo que não funcione como deveria.

De qualquer forma, é interessante que esse problema só surge naquele específico
caso que eu havia explicado. Uma vez que esse caso não acontece muito, o
todo o script cumpre seu propósito, mas é claro, seria ótimo se eu
poderia encontrar uma solução e eliminar esse problema.

De alguma forma, não há problema até que eu não faça nenhum redimensionamento. Não consegui encontrar
o que causaria esse problema. É estranho que o espaço para esses widgets
da grade principal são mantidos corretamente e até mesmo a posição x permanece correta
para todos os widgets, apenas a posição y torna-se incorreta. Mais estranho
que tudo volta ao normal quando eu faço alguma reposição. É isso
possível que o redimensionamento mude alguma opção ou variável que causa
posicionamento para não calcular corretamente? Eu não mergulhei em seu código também
muito, então estou apenas supondo.

Obrigado mesmo assim.

  1. máj. 6. 22:08 ezt írta ("radiolips" [email protected] ):

Ei, @PrincessOfSecret https://github.com/PrincessOfSecret ! Sua
as capturas de tela parecem muito interessantes!

Obrigado por fornecer todo esse código, mas você poderia juntar um
brigou com um exemplo do problema? Essa é a maneira mais fácil para mim
ser capaz de verificar o problema e certificar-se de que posso corrigi-lo.

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/troolee/gridstack.js/issues/655#issuecomment-299663059 ,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/AOi6okg0mTgUbBVB_pPSTYmi2UT3HSYmks5r3NM_gaJpZM4NQTuU
.

Eu me pergunto quantos idiomas diferentes usam o gridstack :). Não sei se posso ajudar definitivamente, mas se você quiser me enviar um e-mail diretamente para dylan. [email protected] , talvez eu possa olhar mais diretamente para o seu código. Também estou interessado em saber como está sendo usado! Parece que é para um hotel?

Tive um problema semelhante e resolvi movendo o elemento antes de removê-lo.
grid.move($elem, 0, 0);
grid.removeWidget($elem);

Obrigado, @carlsch , esse truque também resolveu meu problema. :)

Tive o mesmo problema aqui com GridStack 0.3.0, mesmo sem ter grades aninhadas (apenas uma grade simples; porém, o problema só ocorria em configurações específicas de widgets). Posso confirmar que a correção de @carlsch estava funcionando (obrigado!).

No entanto, ao atualizar para GridStack 0.4.0 tudo funciona, mesmo sem o hack. Então, eu sugiro atualizar para 0.4.0 também @PrincessOfSecret e @carlsch.

@radiolips obrigado pela nova versão!

Esta página foi útil?
0 / 5 - 0 avaliações