【问题标题】:Datepicker don't closes after picking same date GWTDatepicker 在选择相同日期 GWT 后不会关闭
【发布时间】:2017-11-10 20:28:32
【问题描述】:

我正在从 java-script 调用 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");
    });
}-*/;

在附加的方法中再次调用此方法。

问题是日期选择器在选择已选择的相同日期后不会关闭,但在值更改时它会关闭。即使在选择与之前相同的日期后,我也想关闭它。 附加方法如下

    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();

        }
    });

【问题讨论】:

    标签: java jquery gwt datepicker


    【解决方案1】:

    有点晚了,但如果有人遇到同样的问题,也许会有所帮助。

    我犯了同样的错误。问题是,如果选择了不同的值,则更改事件仅触发。如果用户再次选择相同的值,则值不会发生变化,事件不会触发,您的代码不会被执行并且弹出窗口不会隐藏。

    您必须使用点击事件而不是值更改事件。然后通过每次点击,即使在旧值上,代码也会被执行。但是,如果您只是将更改事件替换为单击事件,那么当用户单击日期选择器的标题时也会执行代码,例如当他单击箭头以选择不同的月份时。这会破坏日期选择器的功能。

    因此,在点击事件中,您必须检查点击是否真的在日期单元格中,而不是在标题中。这可以通过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 和底层的CalendarViewfinal 并且不能扩展到为内容提供必要检查的子类。)

    【讨论】:

      【解决方案2】:

      您的 JSNI 错误:您获得了对 hide() 方法的方法引用,但实际上并未调用它。此外,回调中的 this 可能是 HTML 元素,而不是该方法所属的类(最后,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");
        });
      }-*/;
      

      【讨论】:

      • 我明白你在说什么。但在此之后它仍然不起作用。它不调用该方法
      • 哈! this 可能不是你想的那样!更新了我的答案。
      • 不,它不工作。我无法找出原因。
      猜你喜欢
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 2013-05-29
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多