如何在运行时通过字符串连接创建函数或对象属性名称?

发布于 2024-11-02 19:36:37 字数 1372 浏览 0 评论 0原文

我创建了 portlet,并且页面上可能有多个 portlet 实例,因此必须标识函数和 dom 元素,也就是说它们必须以特定名称空间开头。

所以在某些情况下,我必须将我的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'
            }
}
......

significanceLevel JSP 生成 _my_namespace_significanceLevel: 。 即使我将 myNamespace(来自 JSP 中的 JS - 在服务器端解析的命名空间)传递到构造函数中,我也无法在运行时创建 myNamespace + 'methodName'

命名空间仅在服务器端已知。因此,一个 JS 始终必须位于 JSP 页面中,以便解析 并且所有其他 JS 对象都可以通过构造函数参数来访问它。

这是一种解决方法,但在许多情况下无法使用:

window[instance._method] = function() {
    instance.fileAddError.apply(instance, arguments);
};

其中 _method 的名称是由字符串文字连接而成的

I create portlets and there can be many instance of a portlet on a page, so that the functions and dom elements must be identified, AKA they must start with a particular namespace.

so that in some cases, I have to have my JS in a JSP page and cannot move it to a separate file, it is very inconvenient and hard to maintain.

a javascript in a JSP

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'
            }
}
......

From <portlet:namespace />significanceLevel JSP generates _my_namespace_significanceLevel: .
Even if I pass myNamespace (from a JS in JSP - namespaces resolved on serverside) into a constructor, I cannot create myNamespace + 'methodName' in runtime

Namespace is only known on serverSide. So that one JS always has to be in a JSP page so that <portlet:namespace /> is resolved and all other JS objects have it accessible via constructor parameter for instance.

this is one workaround, but it cannot be used in many cases :

window[instance._method] = function() {
    instance.fileAddError.apply(instance, arguments);
};

where the name of _method was concatenated from string literals

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

固执像三岁 2024-11-09 19:36:37

在运行时向对象添加动态属性很容易:

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

It is easy to add dynamic properties to objects during runtime:

rules[namespace + 'significanceLevel'] = {digits: true};

So you could do something along the lines of:

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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文