Вывода текста в область валидации полей ввода (baseedit.js)

Здравствуйте.

Нужно реализовать возможность вывода текста в область валидации компонентов, не используя механизм валидации.

Реализовал следующий код:

define("BaseAddressPageV2", ["BusinessRuleModule"], function(BusinessRuleModule) {
    return {
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "merge",
                "name": "Address",
                "values": {
                    "bindTo": "Address",
                    "controlConfig": {
                        "focus": {"bindTo": "onAddressFocused"},
                        "blur": {"bindTo": "onAddressBlur"}
                    }
                }
            }
        ]/**SCHEMA_DIFF*/,
        methods: {
            onAddressFocused: function(config) {
                                this.showAddressMask(config.scope, true);
            },
            onAddressBlur: function(config) {
                                this.showAddressMask(config.scope, false);
            },
            showAddressMask: function(scope, isShow) {
                if (isShow) {
                    var AddressMaskMessage = this.get("Resources.Strings.AddressMaskMessage");                  
                    scope.showValidationMessage(AddressMaskMessage);              
                } else {
                    scope.showValidationMessage("");
                }
            }
        }
    };
});

При фокусе и потере фокуса события срабатывают, но после выполнения функции showValidationMessage, подсмотренной в baseedit.js, сообщение не появляется.

Подскажите пожалуйста чего не хватает.

Нравится

10 комментариев

а в scope у вас что? showValidationMessage - это метод контрола, на странице такого нет.
а лучше попробуйте сами отладиться

Андрей, в приложение файл config.txt с копией дерева config из консоли.

Насколько я понимаю при подписке на focus контрола, в функцию передается объект со стандартной функцией applyHighlight(она тоже срабатывает, т.к. синяя рамка отрисовываеться) которая подписана на focus контрола и scope(сам контрол).

В файле можно увидеть что в прототипе scope(контрола) есть функция showValidationMessage.
Т.е. я вызываю функцию контрола showValidationMessage, но ничего не появляется.

Что я делаю неправильно?

Здравствуйте!

Функция showValidationMessage должна выполняться в контексте Terrasoft.BaseEdit.

В данном случае обработчик фокуса не содержит аргументов, т.е. scope – пустой.

"Павел Баштовой" написал:Функция showValidationMessage должна выполняться в контексте Terrasoft.BaseEdit.

В данном случае обработчик фокуса не содержит аргументов, т.е. scope – пустой


содержит, в т.ч. и TextEdit, в котором метод showValidationMessage присутствует, но не работает

"Дашкевич К." написал:Т.е. я вызываю функцию контрола showValidationMessage, но ничего не появляется.

Пожалуйста, уточните, что происходит при вызове этой функции, есть ли ошибки?

Также проблема может быть связана с пустым AddressMaskMessage.

"Павел Баштовой" написал:
Дашкевич К. пишет:

Т.е. я вызываю функцию контрола showValidationMessage, но ничего не появляется.

Пожалуйста, уточните, что происходит при вызове этой функции, есть ли ошибки?

Также проблема может быть связана с пустым AddressMaskMessage.

Ошибок нет, функция выполняется, но текст не выводиться.
Можно поподробнее про AddressMaskMessage.

Исходя из реализованного Вами кода, AddressMaskMessage это локализованная строка, отвечающая за выводимое в строке валидации значение. И в случае, если его значение пустое, то выводить будет нечего.

Нет, даже если выводить текст напрямую, он не выводиться.

Зато с помощью функции showValidationMessage, получается менять текст, уже выведенный с помощью стандартного механизма валидации.
Проблема в том что функция showValidationMessage выводит текст в элемент с классом class="base-edit-validation", но не отображает его style visibility=hidden. Буду искать функцию которая отвечает за его отображение.
Может подскажите как из моего контекста изменить style элемента компонента TextEdit.

Можно попробовать переопределить класс, добавив .AddClass.

Также можно вызвать SetValidationInfo c параметром isValid="true", в baseedit.js

Павел, спасибо за наводку в SetValidationInfo нашел функцию отображения контейнера с текстом валидации.

В итоге выглядит так:

define("BaseAddressPageV2", ["BusinessRuleModule"], function(BusinessRuleModule) {
    return {
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "merge",
                "name": "Address",
                "values": {
                    "bindTo": "Address",
                    "controlConfig": {
                        "focus": {"bindTo": "onAddressFocused"},
                        "blur": {"bindTo": "onAddressBlur"}
                    }
                }
            }
        ]/**SCHEMA_DIFF*/,
        methods: {
            onAddressFocused: function(config) {
                this.showAddressMask(config.scope, true);
            },
            onAddressBlur: function(config) {
                this.showAddressMask(config.scope, false);
            },
            showAddressMask: function(scope, isShow) {
                var AddressMaskMessage = this.get("Resources.Strings.AddressMaskMessage");
                var validationEl = scope.getValidationEl();
                validationEl.setVisible(isShow);
                scope.showValidationMessage(isShow ? AddressMaskMessage : "");
            }
        }
    };
});
Показать все комментарии