我创建了portlet,页面上可能有很多portlet实例,因此必须识别函数和dom元素,AKA必须以特定的命名空间开头。
因此,在某些情况下,我必须将我的JS放在JSP页面中,并且不能将其移动到单独的文件中,这非常不方便且难以维护。
JSP中的javascript
var validator = new A.FormValidator({
boundingBox: document.orderForm,
validateOnBlur: true,
validateOnInput: false,
rules: {
<portlet:namespace />significanceLevel: {
digits: true
},
<portlet:namespace />languageFrom: {
required: true,
notEqualTo: '#<portlet:namespace />languageTo'
},
<portlet:namespace />languageTo: {
required: true,
notEqualTo: '#<portlet:namespace />languageFrom'
}
}
......
从<portlet:namespace />significanceLevel
JSP生成_my_namespace_significanceLevel:
。
即使我将myNamespace(从JSP中的JS - 在服务器端解析的命名空间)传递给构造函数,我也无法在运行时创建myNamespace +'methodName'
命名空间仅在serverSide上已知。因此,一个JS总是必须在JSP页面中,以便解析<portlet:namespace />
,并且所有其他JS对象都可以通过构造函数参数访问它。
这是一种解决方法,但在许多情况下不能使用:
window[instance._method] = function() {
instance.fileAddError.apply(instance, arguments);
};
其中_method的名称是从字符串文字连接的
答案 0 :(得分:1)
在运行时很容易向对象添加动态属性:
rules[namespace + 'significanceLevel'] = {digits: true};
所以你可以按照以下方式做点什么:
var namespace = <portlet:namespace />;
var opts = {
boundingBox: document.orderForm,
validateOnBlur: true,
validateOnInput: true,
rules: {};
};
var addRule = function (name, rule) {
opts.rules[namespace + name] = rule;
}
addRule('significanceLevel', {digits: true});
addRule('languageFrom', {...});
// etc...
var validator = new A.FormValidator(opts);