JSF 2.0: لماذا يتم إنشاء حبة JSF عند استخدامها في مكون لم يتم تقديمه؟

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

سؤال

دعونا نحصل على مكون مركب بسيط للغاية:

<cc:implementation>
    #{testBean.someField}
</cc:implementation>

فول من أجل ذلك:

public class TestBean {

    private boolean someField = false;
    public boolean getSomeField() { return someField; }

    @PostConstruct
    public void init() {
        System.out.println("PostConstruct");
    }

}

ثم نسميها كالمعتاد ولكن لا تظهرها:

<codeEditor:test rendered="#{false}" />

ما يحدث هو أن المكون لم يتم تقديمه أبدًا وأن الفول لا يبدأ أبدًا كما يفترض المرء.

ومع ذلك ، إذا قمنا بتغيير المكون على النحو التالي:

<cc:implementation>
    <h:outputText value="#{testBean.someField}" />
</cc:implementation>

ما يحدث هو أن المكون لا يزال يتم تقديمه أبدًا (لأن rendered السمة هي false) ، ومع ذلك ، فإن الفول لا يحصل على مثيل. يحدث هذا دائمًا عندما نستخدم خاصية فول داخل بعض مكونات JSF الأصلية (h:panelGroup, h:inputHidden, ، ما من أي وقت مضى).

لماذا هو كذلك؟

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

المحلول

يتم إنشاء مكونات (وجميع الفاصوليا المقيدة) أثناء وقت البناء. يتم تقييم السمة المقدمة فقط أثناء عرض وقت العرض. لقد عملت دائمًا بهذه الطريقة في JSF.

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

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