سؤال
بدأت في البحث في استخدام GWT بالاشتراك مع UiBuilder. أنا في حيرة بعض الشيء حول كيفية استخدامك @UiHandler(..)
التوجيه لجعل رمز مقبض الأحداث البسيط كما هو مكتوب في توثيق GWT:
@UiHandler("button")
void handleClick(ClickEvent e) {
Window.alert("Hello, AJAX");
}
في هذه الحالة الطريقة handleClick
يستخدم. كيف تعرف لكل عنصر واجهة مستخدم GWT ما هي الطرق التي يمكن إنشاؤها بها @UiHandler
؟ بالنسبة للبعض ، يمكنك أيضًا إنشاء ملف doClose()
طريقة.
ولكن ما الذي يمكنك استخدامه ، على سبيل المثال ، أ ListBox
للحصول على حدث تم تحديد عنصر؟ أين يمكنني رؤية هذا في الوثائق؟
المحلول
المعلمة التي تنتقلها إلى @UiHandler
التعليق التوضيحي هو اسم الحقل المناسب الذي تريد تعيينه *Handler
. لذلك ، في هذه الحالة تقوم بتعيين ملف ClickHandler
إلى Button button
(في الواقع ، نحن نعرف فقط اسم الحقل).
بالنسبة لكيفية عمل هذا بالضبط - إنه جزء من GWT Magic :) أعتقد أنه ، تمامًا مثل أي رمز آخر مرتبط بـ Uibinder (أعتقد أنه كان هناك عرض تقديمي على Google IO ، أظهر الكود الذي يولده UiBinder) ، في وقت التجميع التحويل البرمجي يكتشف ما الذي يحدث. في هذا المثال: لدينا ملف Button button
, ، ولدينا @UiHandler
طريقة مشروحة لها ClickEvent
المعلمة -> ذلك يجب يعني أنها أ ClickHandler
(لاحظ أن اسم الطريقة لا قضيه). لذلك دعونا نضيف بعض التعليمات البرمجية في وقت الترجمة (في المُنشئ ، على الأرجح) الذي يضيف هذا المعالج إلى الزر. إذا كنت مهتمًا بإجابة أكثر شمولاً - تحقق من المصدر: د
ولكن ما الذي يمكنك استخدامه ، على سبيل المثال ، أ
ListBox
للحصول على حدث تم تحديد عنصر؟ أين يمكنني رؤية هذا في الوثائق؟
في ال GWT API Reference. في هذه الحالة ، ربما تبحث عنها listbox.addChangeHandler. لكنك عادة لن تجد @UiHandler
رمز ذي صلة هناك - هذا لأنه سيكون زائداً - يمكنك دائمًا بناء @UiHandler
طرق بنفس الطريقة:
- يمكنك التحقق من
*Handler
التي تريد إضافتها ، قلChangeHandler
لديها
void onChange(ChangeEvent event)
- لذلك ، تحتاج طريقتكChangeEvent
المعلمة ويجب أن تبدو هكذا:@UiHandler("listBox") void whateverName(ChangeEvent event) { // ... }
نصائح أخرى
ربما تكون مشكلتك في طريقة onModuleLoad الخاصة بك:
public void onModuleLoad()
{
HelloWorld helloWorld = new HelloWorld("BOTAO");
// Using this way @UiHandler will not work
//Document.get().getBody().appendChild(helloWorld.getElement());
// correct way
RootPanel.get().add(helloWorld);
}