在使用Dojo触发onChange之前,我可以更改输入中输入的值吗?

时间:2017-03-20 15:07:34

标签: javascript struts2 dojo

我们使用Dojo 1.9.3,我们有自定义Widget,它本质上是一个包装器,可以包含任何其他Dojo小部件以及任何Struts2 JSP组件。

我们目前在使用这些组件时遇到问题,在将这些组件发送到服务器时,会保留输入到子组件中的两端的尾随空格。这会导致用户可能认为该值有效的错误,但实际上并非如此。

我们目前使用以下代码处理onchange事件(为简洁起见,已删除了一些代码)。

var containedWidgetId = this.containedWidgetId;
var containedWidget = registry.byId(this.containedWidgetId);
if (typeof containedWidget === "undefined") {
    containedWidget = dom.byId(this.containedWidgetId);
}

// get the Titlepane for later use.
var titlePane = registry.byId(this.containedWidgetId
                + "titleNodePane");

// Changes the Title and closes the TitlePane.
this.own(on(containedWidget, "change", function(e) {
    var newVal = "";
    // First check if the component value is stored as the displayed value.
    if (typeof containedWidget.attr == "function"
            && containedWidget.attr("displayedValue") !== null) {
        newVal = containedWidget.attr("displayedValue");
    }
    // if not, check if the onChange event is a Standard Dojo event.
    if (typeof e === "object") {
        newVal = containedWidget.value;
    } 
    var newTitle = this.prefixTitle + newVal;

    titlePane.set("title", newTitle);
    this.close();
    // tell the main page to do whatever is needed after the TitlePane is changed.
    this.onUpdate();
}.bind(this)));

有没有办法告诉Dojo"在此组件(可以是Dojo组件以及常规HTML组件)之前触发此onChange事件,在输入上执行trim()&#34 ;?请注意,它需要处理Dojo输入以外的其他内容。

我已尝试过aspect.before和aspect.around,但在使用其中任何一个时,我似乎无法获得输入参数。作为方面的一个例子,在此之前不起作用:

this.own(aspect.before(containedWidget, "onChange", function(e){
    if(typeof e === "string"){
        e = e.trim();                   
    }
    return [e];
}));

代码在onChange之前被触发,但我似乎无法获得输入值。

1 个答案:

答案 0 :(得分:0)

我认为您可以使用客户设置器解决此问题。

setter(必须使用特殊签名定义为dojo要求)可以检测值,更改该值(例如应用修剪)并使其在窗口小部件中可用。

自定义setter dojo方式的示例:

_setFooAttr: function (value) {
     value = value.trim(); // do your trim here 
     this._set('foo', value);
 }

您可以使用以下方式恢复修剪后的值:

var value = this.get('foo');

关于自定义getter和setter的有趣文章:

http://dojotoolkit.org/reference-guide/1.10/quickstart/writingWidgets.html#quickstart-writingwidgets

https://www.sitepen.com/blog/2013/10/16/dojo-faq-what-is-the-difference-between-set-and-_set/