Как создать имя свойства функции или объекта во время выполнения с помощью конкатенации строк? - PullRequest
1 голос
/ 20 апреля 2011

Я создаю портлеты, и на странице может быть много экземпляров портлета, так что функции и элементы dom должны быть идентифицированы, иначе они должны начинаться с определенного пространства имен.

так что в некоторых случаях мне нужно иметь свой JS на странице JSP и не могу переместить его в отдельный файл, это очень неудобно и трудно поддерживать.

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

С <portlet:namespace />significanceLevel JSP генерирует _my_namespace_significanceLevel:. Даже если я передам myNamespace (из JS в JSP - пространства имен, разрешенные на стороне сервера) в конструктор, я не могу создать myNamespace + 'methodName' во время выполнения

Пространство имен известно только на стороне сервера. Так что один JS всегда должен быть на странице JSP, чтобы разрешить <portlet:namespace />, а все другие объекты JS, например, доступны через параметр конструктора.

это один из обходных путей, но его нельзя использовать во многих случаях:

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

где имя _method было объединено из строковых литералов

1 Ответ

1 голос
/ 20 апреля 2011

Легко добавить динамические свойства к объектам во время выполнения:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...