Gridstack.js: إزالة عنصر واجهة مستخدم الشبكة الرئيسية المتداخلة من الصف الأخير من الشبكة الرئيسية مما تسبب في فقدان بعض أدوات الشبكة الرئيسية لموقعها

تم إنشاؤها على ٤ مايو ٢٠١٧  ·  6تعليقات  ·  مصدر: gridstack/gridstack.js

أهلا،

لقد واجهت سلوكًا غريبًا عندما أغير الحجم ثم أزل شبكة متداخلة من شبكتها الأصلية.

لدي شبكتان ، إحداهما متداخلة في العنصر المحدد للآخر.
من الممكن إضافة وإزالة عناصر واجهة المستخدم في كلتا الشبكتين عن طريق تحديد / إلغاء تحديد بعض مربعات الاختيار.
عندما أقوم بإزالة عناصر واجهة المستخدم من الشبكة المتداخلة ، أقوم بتغيير حجم عنصر واجهة الشبكة الأصلي ليكون دائمًا بحد أقصى ارتفاع الشبكة المتداخلة.
عندما تصبح الشبكة المتداخلة فارغة ، يجب إزالتها من الشبكة الرئيسية.

في الواقع كل شيء يعمل بشكل جيد حتى حالة واحدة محددة:

  1. الشبكة المتداخلة موجودة في الصف الأخير من الشبكة الرئيسية
  2. يتم إجراء تغيير حجم الشبكة المتداخلة باستخدام grid.resize ()
  3. إزالة آخر عنصر واجهة مستخدم من الشبكة المتداخلة مع gridNested.removeWidget ()
  4. إزالة عنصر واجهة المستخدم الأصلي للشبكة المتداخلة من الشبكة الرئيسية باستخدام grid.removeWidget ().

عند الانتهاء من هذه الخطوات ، فقدت الأدوات القليلة الأخيرة من عناصر واجهة المستخدم للشبكة مواقعها وتقفز إلى الصف الأول من الشبكة الرئيسية - تظل جميع سمات البيانات الخاصة بها صحيحة ، ويصبح موضعها خاطئًا (أعلى: 0 ، أسفل: ارتفاع الشبكة) ). عندما أقوم بإعادة إضافة الشبكة المتداخلة ، يعود كل شيء إلى الموضع الصحيح ، ولكن بعد إزالة الشبكة المتداخلة مرة أخرى ، يحدث الشيء الغريب مرة أخرى. عندما قمت بتنفيذ الخطوات المذكورة أعلاه مرة واحدة ثم حاولت إزالة عناصر واجهة المستخدم من الشبكة الرئيسية ، فإن هذه الأدوات تظل تطفو أيضًا إلى الصف الأول ثم تعود بعد إضافة عنصر واجهة مستخدم. عندما أقوم بنقل الشبكة المتداخلة في أي مكان آخر غير الصف الأخير ، فلن تحدث إعادة تعيين غير صحيحة.

أثناء التحقيق ، لن تحدث إعادة الوضع الغريبة إلا بعد أن قمت مرة واحدة بتغيير حجم الأداة الرئيسية للشبكة المتداخلة ، حتى تعمل إضافة وإزالة الحاجيات إلى كلتا الشبكتين بشكل جيد. لذلك يبدو أن تغيير الحجم يفسد الأشياء.

لسوء الحظ لا يمكنني تقديم كمان عملي لأن هذا ليس سوى جزء من نص أكبر ، يمكنني فقط إرفاق لقطات شاشة لكيفية ظهوره.

قبل إزالة الشبكة المتداخلة (ذات الحدود):
gridstack2
بعد إزالة الشبكة المتداخلة ، اختفت بعض الأدوات الأخرى من موضعها الأصلي وتطفو إلى الصف الأول من الشبكة الرئيسية ، بينما يتم الاحتفاظ بمكانها في الشبكة في الموضع الصحيح (مساحة بيضاء فارغة في الأسفل):
gridstack3

يتم تهيئة شبكاتي باستخدام هذه الخيارات:

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');

تبدو بنية HTML كما يلي:

<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>

أقوم بتغيير حجم عنصر واجهة المستخدم الأصلي للشبكة المتداخلة بهذه الطريقة:

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);
    }
}

أقوم بإزالة عناصر واجهة المستخدم من الشبكة المتداخلة بهذه الطريقة:

![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();
}

ما الخطأ الذي افعله؟ هل أسيء استخدام شيء ما؟ أو هل وجدت خطأ؟ :)

شكرا لك مقدما.

التعليق الأكثر فائدة

واجهت نفس المشكلة هنا مع GridStack 0.3.0 ، حتى بدون وجود شبكات متداخلة (مجرد شبكة واحدة بسيطة ؛ حدثت المشكلة فقط في تكوينات محددة من عناصر واجهة المستخدم). يمكنني أن أؤكد أن إصلاح carlsch كان يعمل (شكرًا!).

ومع ذلك ، عند الترقية إلى GridStack 0.4.0 ، يعمل كل شيء ، حتى بدون الاختراق. لذا أقترح الترقية إلى 0.4.0 أيضًا PrincessOfSecret وcarlsch.

radiolips شكرا على الإصدار الجديد!

ال 6 كومينتر

مرحبًا يا PrincessOfSecret ! لقطات الشاشة الخاصة بك تبدو مثيرة جدا للاهتمام!

نشكرك على تقديم كل هذا الرمز ، ولكن هل يمكنك تجميع jsfiddle بمثال عن المشكلة؟ هذه هي أسهل طريقة بالنسبة لي لأتمكن من التحقق من المشكلة والتأكد من أنني قادر على إصلاحها.

شكرا على الرد.

حاولت تجميع jsfiddle ، لكن لسوء الحظ لم تنجح كما هي
اضطررت ، لأنه كما قلت ، إنه جزء معقد للغاية ولم أستطع
عزل هذه المشكلة لتكون قابلة للاختبار بالنسبة لك. سأحاول إعادة إنتاجه في
jsfiddle مرة أخرى ، لكنني أخشى ألا يعمل كما ينبغي.

على أي حال ، من المثير للاهتمام أن هذه المشكلة لا تظهر إلا في هذا النطاق المحدد
الحالة التي شرحتها. نظرًا لأن هذه الحالة لا تحدث كثيرًا ، فإن
يفي النص بأكمله بالغرض منه ، لكن بالطبع سيكون رائعًا لو فعلت ذلك
يمكن أن تجد حلاً والقضاء على هذه المشكلة.

بطريقة ما لا توجد مشكلة حتى لا أقوم بأي تغيير الحجم. لم أجد
ما من شأنه أن يسبب هذه المشكلة. والغريب أن مساحة تلك الحاجيات
من الشبكة الرئيسية يتم الاحتفاظ بها بشكل صحيح وحتى موضع x يظل صحيحًا
بالنسبة لجميع الأدوات ، يصبح الموضع y فقط غير صحيح. أكثر غرابة
أن كل شيء يعود إلى طبيعته عندما أفعل أي تغيير. فعلا
من الممكن أن يؤدي تغيير الحجم إلى تغيير بعض الخيارات أو المتغيرات التي تسببها
تحديد المواقع لعدم الحساب بشكل صحيح؟ أنا لم أغوص في التعليمات البرمجية الخاصة بك أيضا
كثيرا ، لذلك أنا فقط أخمن.

شكرا على كل حال.

  1. ماج. 6. 22:08 ezt írta ("radiolips" [email protected] ):

مرحبًا ، @ PrincessOfSecret https://github.com/PrincessOfSecret ! لك
لقطات تبدو مثيرة جدا للاهتمام!

نشكرك على تقديم كل هذا الرمز ، ولكن هل يمكنك تجميع ملف
jsfiddle مع مثال للمشكلة؟ هذا هو أسهل طريقة بالنسبة لي
أن تكون قادرًا على التحقق من المشكلة والتأكد من أنني قادر على إصلاحها.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/troolee/gridstack.js/issues/655#issuecomment-299663059 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AOi6okg0mTgUbBVB_pPSTYmi2UT3HSYmks5r3NM_gaJpZM4NQTuU
.

أتساءل كم عدد اللغات المختلفة التي تستخدم Gridstack :). لا أعلم أنه يمكنني المساعدة بالتأكيد ، ولكن إذا كنت تريد مراسلتي عبر البريد الإلكتروني مباشرة على dylan. [email protected] ، ربما يمكنني إلقاء نظرة مباشرة على التعليمات البرمجية الخاصة بك. أنا مهتم أيضًا بمعرفة كيفية استخدامه! يبدو أنه ربما يكون من أجل فندق؟

واجهت مشكلة مماثلة وقمت بحلها عن طريق تحريك العنصر قبل إزالته.
grid.move($elem, 0, 0);
grid.removeWidget($elem);

شكرًا لك ، carlsch ، لقد حلت هذه الحيلة مشكلتي أيضًا. :)

واجهت نفس المشكلة هنا مع GridStack 0.3.0 ، حتى بدون وجود شبكات متداخلة (مجرد شبكة واحدة بسيطة ؛ حدثت المشكلة فقط في تكوينات محددة من عناصر واجهة المستخدم). يمكنني أن أؤكد أن إصلاح carlsch كان يعمل (شكرًا!).

ومع ذلك ، عند الترقية إلى GridStack 0.4.0 ، يعمل كل شيء ، حتى بدون الاختراق. لذا أقترح الترقية إلى 0.4.0 أيضًا PrincessOfSecret وcarlsch.

radiolips شكرا على الإصدار الجديد!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات