2015-03-12 5 views
1

У меня установлены схемы, чтобы иметь массив комплексных наборов ввода. Что-то вроде:AutoForm 5.0.2 вложенные входы схемы, необходимые для обновления

address = { 
    street:{ 
    type: String 
    }, 
    city: { 
    type: String 
    }, 
    active_address: { 
    type: Boolean, 
    optional: true 
    }, 
    ... 
} 

people: { 
    name:{ 
    type: String 
    }, 

    address:{ 
    type: [address], 
    optional: true, 
    defaultValue: [] 
    } 
} 

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

Это работало (я полагаю, это было) версия 4.2.2. Это все еще работает на insert типах автоформ, но не на update типах автоформ. Выполняя обновление, ни одно из полей не будет отправлено, если только все обязательные поля в вложенной схеме также действительны.

Для справки, я создаю форму как таковую:

{{#autoForm collection="people" id=formId type="update" doc=getDocument autosave=true template="autoupdate"}}  
    {{> afQuickField name='name' template="autoupdate" placeholder="schemaLabel"}} 
    {{> afQuickField name='address' template="autoupdate"}} 
{{/autoForm}} 

Мои шаблоны (autoupdate) Я копировать-вставить полноту шаблонов bootstrap3 AUTOFORM и переставить некоторые HTML, чтобы соответствовать моим потребностям. Я обновил их, насколько это возможно, согласно обновлению 5.0.0 при обновлении. Возможно, он может быть там, если кто-то может подумать об атрибуте в шаблонах, который приведет к непоследовательному поведению между вставкой и обновлением, которые были изменены в 5.0.0.

Дополнительная информация

Я просто попытался воссоздать все мои шаблоны форм с использованием шаблонов bootstrap3 из 5.0.2. Все-таки такое же поведение.

+

У меня есть (параметр) вход булеву в адресной схеме. Глядя в документ, массив адресов заполняется [0 : {active_address: false}]

active_address: { 
    type: Boolean, 
    optional: true 
} 

Не уверен, если это помогает ...

+

По предложению @ Марк, я добавил DefaultValue: []. Он исправил проблему ... вроде. В форме обновления нет «открытых» вложенных схем, и другие значения могут быть изменены. Если вы «добавили» вложенную схему в форму с помощью кнопки добавления, вся эта форма становится необходимой, даже если вы не вставляете какое-либо значение ни в какое поле. Это происходит независимо от ввода типа Boolean.

Я могу пригводить вход ввода Boolean во вложенной схеме, чтобы вся вложенная схема стала необходимой для вставки. Удаление логического входа заставило его снова вставить. Итак, есть новая проблема в том же духе.

Этот новый вопрос можно найти here

+0

Как выглядит документ, который вы обновляете? Есть ли у вас какие-либо поля 'autoValue' /' defaultValue' в поле адреса? – mark

+0

@mark Я этого не делаю. Вы ищете фактический пример документа или схемы? –

+0

@mark Подумал, поэтому я проверил свой документ и добавил некоторую информацию. –

ответ

1

Я думаю, что лучшим решением является добавление defaultValue: [] к address поле в схеме. Поведение, которое вы описали в вопросе (не разрешая обновление), на самом деле предназначено - читайте, чтобы узнать, почему.

Дело в том, что это поведение существует только в том случае, если элемент формы массива уже добавлен в форму. Я имею в виду, что если вы нажмете знак «минус», который удалит входные данные из улицы, города и т. Д. Из формы, обновление будет успешным, потому что AutoForm не неверно интерпретирует снятый флажок, поскольку пользователь явно снимает флажок (и, следовательно, устанавливает значение до false).Установка defaultValue в пустой массив позволяет AutoForm знать, что не представляет адресную форму, если пользователь явно не щелкнул знак плюса (то есть, у них есть адрес, который они хотят ввести), и в этом случае поведение создания улицы, города, и т. д. требуемые поля - это то, что вы хотите.

Обратите внимание, что это означает, что вам необходимо обновить существующие документы в вашей коллекции, которые не имеют поля address, и установите его в пустой массив. Нечто подобное в Монго оболочки:

db.people.update({ "address": { $exists: false } }, { $set: { "address": [] } }, { multi: true }) 

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

Редактировать

Если поведение вы хотите, чтобы показать вложенную форму без делая это требуется, вы можете обойти эту проблему CheckBox с помощью formToDoc крючка и отфильтровывая все объекты адресов, которые только установите поле active_address на false (поле, которое AutoForm ошибочно добавляет для нас).

AutoForm.addHooks('yourFormId', { 
    formToDoc: function (doc) { 
    doc.address = _.reject(doc.address, function (a) { 
     return !a.street && !a.city && !a.active_address; 
    }); 
    return doc; 
    } 
}); 

formToDoc крючка называется каждый раз, когда форма проверенный, так что вы можете использовать его, чтобы изменить документ, чтобы сделать так, чтобы AutoForm никогда даже не знает, что есть адрес подпол, если свойство из него было установлено. Обратите внимание: если вы используете это решение, вам не нужно будет добавлять defaultValue: [], как указано выше.

+0

, чтобы попробовать это ... –

+0

Это работает для того, что я пытаюсь сделать. Я столкнулся с другим вопросом, связанным с этим, теперь я открою еще один вопрос, в основном создавая очень похожую проблему в форме «insert». –

+0

Ваша новая проблема кажется очень похожей или, возможно, такой же, как эта (показывая подформу, не требуя этого). Сейчас у меня мало времени, но когда я думаю о чем-то позже, я обновлю здесь. Вероятно, есть способ обойти это с помощью настраиваемого метода отправки, а не с помощью встроенной формы обновления. – mark