JSF 2.0: الحفاظ على حالة المكون عبر وجهات نظر متعددة

StackOverflow https://stackoverflow.com/questions/4605785

  •  25-09-2019
  •  | 
  •  

سؤال

يتم تقسيم تطبيق الويب الذي أقوم بتطويره باستخدام MyFaces 2.0.3 / PrimeFaces 2.2rc2 إلى محتوى ومنطقة تنقل. في منطقة التنقل ، والتي يتم تضمينها في صفحات متعددة باستخدام templating (أي <ui:define>) ، هناك بعض الأدوات (مثل شجرة التنقل ، والألواح القابلة للطي ، وما إلى ذلك) والتي أريد الحفاظ عليها عن حالة المكون عبر وجهات النظر.

على سبيل المثال ، دعنا نقول أنني على الصفحة الرئيسية. عندما أتنقل إلى صفحة تفاصيل المنتج من خلال النقر على منتج في شجرة التنقل ، فإن رمز Java الخاص بي يؤدي إلى إعادة توجيه باستخدام استخدام

navigationHandler.handleNavigation(context, null,
  "/detailspage.jsf?faces-redirect=true")

هناك طريقة أخرى للوصول إلى صفحة التفاصيل هذه عن طريق النقر المباشر على دعابة منتج يتم عرضها على الصفحة الرئيسية. المناظرة <h:link> سيقودنا إلى صفحة التفاصيل.

في كلتا الحالتين ، يتم فقدان حالة التوسع لشجرة التنقل الخاصة بي (مكون شجرة PrimeFaces) وفقدان الألواح القابلة للطي. أنا أفهم هذا لأن إعادة التوجيه / h:link النتائج في إنشاء وجهة نظر جديدة.

ما هي أفضل طريقة للتعامل مع هذا؟ أنا بالفعل أستخدم أوركسترا MyFaces في مشروعي إلى جانب نطاق محادثتها ، لكنني لست متأكدًا مما إذا كان هذا من أي مساعدة هنا (حيث يجب أن ربط حالة التوسع/المنهارة من الأدوات المصغّرة إلى حبة دعم ... لكن بقدر ما أعرف ، هذا غير ممكن). هل هناك طريقة لإخبار JSF أي مكون ينشر إلى النظرة التالية ، على افتراض وجود نفس المكون في هذا الرأي؟

أعتقد أنني قد أحتاج إلى مؤشر في الاتجاه الصحيح هنا. شكرًا!


تحديث 1: لقد حاولت للتو ربط الألواح والشجرة بالفاصوليا المغطاة بالجلسة ، ولكن يبدو أن هذا ليس له أي تأثير. أيضًا ، أعتقد أنه سيتعين علي ربط جميع مكونات الطفل (إن وجدت) يدويًا ، لذلك لا يبدو هذا هو الطريق للذهاب.

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

  • عند انهيار اللوحة أو يتم توسيع الشجرة ، احفظ الحالة الحالية في حبة دعم مدعومة بالجلسة (! = مكون واجهة المستخدم نفسه)
  • يتم تخزين حالات المكونات في الخريطة. مفتاح الخريطة هو المعرف النسبي الفريد للمكون (نأمل). لا يمكنني استخدام مسار المكون المطلق بالكامل هنا ، نظرًا لأن معرفات حاويات التسمية الأصل قد تتغير إذا تغير العرض ، على افتراض أن هذه المعرفات يتم إنشاؤها برمجيًا.
  • بمجرد أن يتم بناء طريقة عرض جديدة ، استرجع حالات المكونات من الخريطة وتطبيقها على المكونات. على سبيل المثال ، في حالة اللوحات ، يمكنني ضبط collapsed عزا إلى قيمة تم استرجاعها من حبة الدعم المغطاة بالجلسة.

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

<p:panel collapsed="#{backingBean.collapsedState}" ... />

(هذا مثال مبسط. بما أنني أستخدم لوحات متعددة ، فأنا أستخدم خريطة لتخزين هذه الخصائص ، كما هو موضح أعلاه).

هل كانت مفيدة؟

المحلول

سيكون أحد الحلول هو استخدام الفاصوليا المغطاة بالجلسة.

نصائح أخرى

ماذا تقصد باللوحات القابلة للطي؟ أسأل لأن هناك مكونًا قابلاً للإغلاق بالإضافة إلى مكون. أنا أستخدم في جزء التنقل في مشروعي. يحتوي Accordianpanel على سمة تدعى "ActiveIndex". إليكم ما فعلته في جلست بلدي للحفاظ على علامات التبويب "أكورديون":

 private int tabIndex; //declared a private variable

    public SessionBean() {
       tabIndex = 100; //set the initial tab index to 100 so all tabs are closed when page loads.
    }

    public int getTabIndex(){
       return tabIndex;
    }

    public void setTabIndex(int tabIndex){
       this.tabIndex=tabIndex;
    }

in my navigation pane:



<p:accordionPanel activeIndex="#{sessionBean.tabIndex}" collapsible="true" autoHeight="false">
    <p:tab title="#{tab1_title}">
       <h:commandLink value="link here" action="target_page?faces-redirect=true" /><br/>
    </p:tab>
    <p:tab title="#{tab2_title}">
       <h:commandLink value="link here" action="target_page?faces-redirect=true" />
    </p:tab>
    <p:tab title="#{tab3_title}">
       <h:commandLink value="link here" action="target_page?faces-redirect=true" />
    </p:tab>
 </p:accordionPanel>

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top