yiiActiveForm: инициализация формы и динамическое добавление полей

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
avs
Сообщения: 16
Зарегистрирован: 2016.01.22, 21:26

yiiActiveForm: инициализация формы и динамическое добавление полей

Сообщение avs »

Добрый день!

Один из моих скриптов работает в связке с knockout.js и yii.activeForm.js: элемент добавляется в коллекцию, затем вызывается jQuery('#orderInput').yiiActiveForm('add', {...}) для связывания с формой. Данный скрипт расположен выше автоматически сгенерированного кода, инициализирующего форму элементами ввода

Код: Выделить всё

jQuery('#orderInput').yiiActiveForm([{"id":"order-name","name":"name","container":".field-order-name","input":"#order-name","error":".help-block.help-block-error","validate":function (attribute, value, messages, deferred, $form) {yii.validation.string(value, messages, {"message":"Максимум 250 символов","max":250,"tooLong":"Наименование товара should contain at most 250 characters.","skipOnEmpty":1});yii.validation.required(value, messages, {"message":"Не указано наименование товара"});}}
перед тегом </body>. При вызове add до этой инициализации вылетает исключение JS Uncaught TypeError: Cannot read property 'attributes' of undefined:

Код: Выделить всё

 add: function (attribute) {
            var $form = $(this);
            attribute = $.extend({value: getValue($form, attribute)}, attributeDefaults, attribute);
            $form.data('yiiActiveForm').attributes.push(attribute);
            watchAttribute($form, attribute);


В файле yii.activeForm.js фрагмент кода:

Код: Выделить всё

    $.fn.yiiActiveForm = function (method) {
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method ' + method + ' does not exist on jQuery.yiiActiveForm');
            return false;
        }
    };
не вызывает метод инициализации, если запрашивается метод из массива methods. Как быть в такой ситуации:
1) Самому вызывать init перед yiiActiveForm('add', {...})?
2) Переместить скрипт с кодом yiiActiveForm('add', {...}) в самый низ непосредственно перед </body>, но после автоматические сгенерированного JS инициализации формы?
3) Или со стороны разработчиков Yii2 добавить проверку на то, был ли ранее инициализирован объект перед вызовом return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); и если не инициализирован, то сделать это?
SomeOne
Сообщения: 1
Зарегистрирован: 2016.03.17, 22:26

Re: yiiActiveForm: инициализация формы и динамическое добавление полей

Сообщение SomeOne »

Столкнулся с такой же бедой. Удалось как-то решить эту проблему?
snewer
Сообщения: 45
Зарегистрирован: 2016.08.05, 13:10

Re: yiiActiveForm: инициализация формы и динамическое добавление полей

Сообщение snewer »

SomeOne писал(а):Столкнулся с такой же бедой. Удалось как-то решить эту проблему?
Здравствуйте!
Можно использовать конструкцию

Код: Выделить всё

setTimeout(function(){
    jQuery('#orderInput').yiiActiveForm('add', {...})
}, 50);
 
Ответить