Как использовать календарь gwtbootstrap3 с UiBinder

Можем ли мы использовать полный календарь gwtbootstrap3, упомянутый по адресу http://gwtbootstrap3.github.io/gwtbootstrap3-demo/ с UiBinder.

Я пытаюсь использовать его с UiBinder, и на этой странице ничего не отображается.

код для моего класса UiBinder

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
    xmlns:g="urn:import:com.google.gwt.user.client.ui"
    xmlns:b="urn:import:org.gwtbootstrap3.client.ui.gwt">
    <g:HTMLPanel ui:field="calendarContainer">
    </g:HTMLPanel>
</ui:UiBinder> 

код для соответствующего класса представления

public class EventView extends ReverseCompositeView<IEventView.IEventPresenter> implements IEventView {

    private static EventViewUiBinder uiBinder = GWT.create( EventViewUiBinder.class );

    interface EventViewUiBinder extends UiBinder<Widget, EventView> {
    }

    @UiField
    HTMLPanel calendarContainer;

    @Override
    public void createView() {
        //don't create the view before to take advantage of the lazy loading mechanism
        initializeCalendar();
        initWidget( uiBinder.createAndBindUi( this ) );
    }

    private void initializeCalendar() {
        final FullCalendar fc = new FullCalendar("event-calendar", ViewOption.month, true);
        fc.addLoadHandler(new LoadHandler() {
            @Override
            public void onLoad(LoadEvent loadEvent) {
                addEvents();
            }

            private void addEvents() {
                for (int i = 0; i < 15; i++) {
                    Event calEvent = new Event("id "+ i, "this is event "+i);
                    int day = Random.nextInt(10);
                    Date start = new Date();
                    CalendarUtil.addDaysToDate(start, -1 * day);
                    calEvent.setStart(start);
                    if(i%3 ==0){
                        calEvent.setAllDay(true);
                    }else{
                        Date d = new Date(start.getTime());
                        d.setHours(d.getHours()+1);
                        calEvent.setEnd(d);
                    }
                    fc.addEvent(calEvent);
                }
            }

        });

        calendarContainer.add(fc);
    }


}

и я использую mvp4g фреймворк.

1 ответ

Решение
initializeCalendar();
initWidget( uiBinder.createAndBindUi( this ) );

Вы должны сначала инициализировать виджет, а затем инициализировать календарь. Это потому, что вы добавляете свои FullCalendar к calendarContainerHTMLPanel в initializeCalendar, И до звонка initWidget, calendarContainer является null,

Я думаю, что вы можете пойти дальше и сделать это так:

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
    xmlns:g="urn:import:com.google.gwt.user.client.ui"
    xmlns:b="urn:import:org.gwtbootstrap3.client.ui.gwt"
    xmlns:f="urn:import:org.gwtbootstrap3.extras.fullcalendar">
    <g:HTMLPanel>
        <f:FullCalendar ui:field="fullCalendar" />
    </g:HTMLPanel>
</ui:UiBinder>

И тогда в вашем EventView:

@UiField(provided = true) FullCalendar fullCalendar;

@UiField(provided = true) означает, что вам нужно инициализировать этот виджет перед вызовом initWidget, Итак, в этом случае порядок:

initializeCalendar();
initWidget( uiBinder.createAndBindUi( this ) );

все в порядке. Кроме того, вам не нужно добавлять FullCalendar к любой панели больше - она ​​уже добавлена, вам просто нужно ее инициализировать.

Другие вопросы по тегам