选择相同日期 GWT 后 Datepicker 不会关闭
Datepicker don't closes after picking same date GWT
我正在从 java-脚本调用 java 以使用以下方法关闭日期选择器弹出窗口。
private native void attachInternal() /*-{+
$wnd.jQuery("div.datePickerDay.datePickerDayIsValue").on( "Click", function() {
this.@com.booxi.admin.client.common.ui.text.DateFormatter::uiDatePickerPopup.hide();
console.log("OK");
});
}-*/;
在附件的方法中再次调用了该方法
问题是日期选择器在选择已经选择的相同日期后不会关闭,但在值更改时 closes.I 即使在选择与之前相同的日期后也想关闭它。
附加方法如下
public void attach() {
attachInternal();
datePickerValueChangeRegistration = uiDatePicker.addValueChangeHandler(new ValueChangeHandler<Date>() {
@Override
public void onValueChange(ValueChangeEvent<Date> event) {
uiDatePickerPopup.hide();
uiTextDate.setErrorVisible(false);
uiTextDate.setTextNoFormat(Moment.moment(event.getValue()).format("L"));
}
});
textDateClickRegistration = uiTextDate.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
//if (uiTextDate.isReadOnly())
// return;
if (!uiTextDate.isEnabled())
return;
showPopup();
}
});
您的 JSNI 是错误的:您正在获取对 hide()
方法的方法引用,但实际上并未调用它。此外,回调中的 this
可能是 HTML 元素,而不是此方法所属的 class (最后, click
可能必须全部小写 - 我虽然我不知道 jQuery,所以我可能是错的)。
因此应为:
private native void attachInternal() /*-{
var that = this;
$wnd.jQuery("div.datePickerDay.datePickerDayIsValue").on( "click", function() {
that.@com.booxi.admin.client.common.ui.text.DateFormatter::uiDatePickerPopup.hide()();
console.log("OK");
});
}-*/;
有点晚了,但如果有人遇到同样的问题,也许它会有所帮助。
我犯了同样的错误。问题是,更改事件仅在选择不同的值时就触发。如果用户再次选择相同的值,则值不会发生变化,事件不会触发,您的代码不会执行,弹出窗口也不会隐藏。
您必须使用点击事件而不是值更改事件。然后通过每次点击,即使是在旧值上,代码也会被执行。但是,如果您只是将更改事件替换为点击事件,那么当用户点击日期选择器的 header 时,代码也会执行,例如,当他点击箭头选择不同的月份时。这会破坏日期选择器的功能。
因此,在点击事件中,您必须检查点击是否真的在日期单元格中,而不是在 header 中。这可以通过 Element.as(event.getNativeEvent().getEventTarget())
完成并检查元素的内容,最简单的检查内部文本是否是 1 到 31 之间的日期数字。
所以代码是这样的
uiDatePickerPopup.addDomHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Element target = Element.as(event.getNativeEvent().getEventTarget());
String targetContent = target.getInnerText();
try {
int d = Integer.parseInt(targetContent);
if (d >= 1 && d <= 31) {
uiDatePickerPopup.hide();
...
enter the rest of your code here
...
}
} catch (Exception e) {
/* ignore, click was not on a date cell */
}
}
}, ClickEvent.getType());
(据我所知没有更优雅的解决方案。其他可能的事件没有用,你不能将点击事件仅限于日期单元格,因为getView()
方法是protected
和基础 CalendarView
是 final
并且不能扩展到提供必要的内容检查的子类。)
我正在从 java-脚本调用 java 以使用以下方法关闭日期选择器弹出窗口。
private native void attachInternal() /*-{+
$wnd.jQuery("div.datePickerDay.datePickerDayIsValue").on( "Click", function() {
this.@com.booxi.admin.client.common.ui.text.DateFormatter::uiDatePickerPopup.hide();
console.log("OK");
});
}-*/;
在附件的方法中再次调用了该方法
问题是日期选择器在选择已经选择的相同日期后不会关闭,但在值更改时 closes.I 即使在选择与之前相同的日期后也想关闭它。 附加方法如下
public void attach() {
attachInternal();
datePickerValueChangeRegistration = uiDatePicker.addValueChangeHandler(new ValueChangeHandler<Date>() {
@Override
public void onValueChange(ValueChangeEvent<Date> event) {
uiDatePickerPopup.hide();
uiTextDate.setErrorVisible(false);
uiTextDate.setTextNoFormat(Moment.moment(event.getValue()).format("L"));
}
});
textDateClickRegistration = uiTextDate.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
//if (uiTextDate.isReadOnly())
// return;
if (!uiTextDate.isEnabled())
return;
showPopup();
}
});
您的 JSNI 是错误的:您正在获取对 hide()
方法的方法引用,但实际上并未调用它。此外,回调中的 this
可能是 HTML 元素,而不是此方法所属的 class (最后, click
可能必须全部小写 - 我虽然我不知道 jQuery,所以我可能是错的)。
因此应为:
private native void attachInternal() /*-{
var that = this;
$wnd.jQuery("div.datePickerDay.datePickerDayIsValue").on( "click", function() {
that.@com.booxi.admin.client.common.ui.text.DateFormatter::uiDatePickerPopup.hide()();
console.log("OK");
});
}-*/;
有点晚了,但如果有人遇到同样的问题,也许它会有所帮助。
我犯了同样的错误。问题是,更改事件仅在选择不同的值时就触发。如果用户再次选择相同的值,则值不会发生变化,事件不会触发,您的代码不会执行,弹出窗口也不会隐藏。
您必须使用点击事件而不是值更改事件。然后通过每次点击,即使是在旧值上,代码也会被执行。但是,如果您只是将更改事件替换为点击事件,那么当用户点击日期选择器的 header 时,代码也会执行,例如,当他点击箭头选择不同的月份时。这会破坏日期选择器的功能。
因此,在点击事件中,您必须检查点击是否真的在日期单元格中,而不是在 header 中。这可以通过 Element.as(event.getNativeEvent().getEventTarget())
完成并检查元素的内容,最简单的检查内部文本是否是 1 到 31 之间的日期数字。
所以代码是这样的
uiDatePickerPopup.addDomHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Element target = Element.as(event.getNativeEvent().getEventTarget());
String targetContent = target.getInnerText();
try {
int d = Integer.parseInt(targetContent);
if (d >= 1 && d <= 31) {
uiDatePickerPopup.hide();
...
enter the rest of your code here
...
}
} catch (Exception e) {
/* ignore, click was not on a date cell */
}
}
}, ClickEvent.getType());
(据我所知没有更优雅的解决方案。其他可能的事件没有用,你不能将点击事件仅限于日期单元格,因为getView()
方法是protected
和基础 CalendarView
是 final
并且不能扩展到提供必要的内容检查的子类。)