我们使用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之前被触发,但我似乎无法获得输入值。
答案 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/