Вложенные входные данные схемы 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 и переставил часть html в соответствии со своими потребностями. Я обновил их в меру своих возможностей в соответствии с журналом изменений 5.0.0 при обновлении. Возможно, это может быть там, если кто-то подумает об атрибуте в шаблонах, который может вызвать непоследовательное поведение между вставкой и обновлением, которое изменилось в 5.0.0.

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

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

+

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

active_address: {
  type: Boolean,
  optional: true
}

Не уверен, что это поможет...

+

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

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

Эту новую проблему можно найти здесь


person Randy Hall    schedule 12.03.2015    source источник
comment
Как выглядит документ, который вы обновляете? У вас случайно нет полей autoValue/defaultValue в поле адреса?   -  person mark    schedule 17.03.2015
comment
@mark Нет. Вы ищете фактический пример документа или схему?   -  person Randy Hall    schedule 17.03.2015
comment
@mark Заставил меня задуматься, поэтому я проверил свой документ и добавил некоторую информацию.   -  person Randy Hall    schedule 17.03.2015
comment
Итак, я думаю, что активный ввод адреса является виновником. Это приводит к тому, что автоформа добавляет документ, в котором отсутствуют все обязательные поля, такие как улица и город, что, естественно, не проходит проверку схемы. Я лично раньше не использовал логический ввод, но подозреваю, что автоформа ошибочно принимает неотмеченный флажок как ложный, а не как неопределенный. Надо будет проверить, так ли это, когда доберусь до компа.   -  person mark    schedule 17.03.2015
comment
@mark Я настрою тест, переопределяющий вывод этого поля как неопределенный вместо ложного ... или, может быть, удалю его из объекта $ set? Посмотрим   -  person Randy Hall    schedule 17.03.2015
comment
Я думаю, у меня есть это, смотрите мой ответ   -  person mark    schedule 17.03.2015


Ответы (1)


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

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

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

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

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

Изменить

Если вы хотите, чтобы подчиненная форма отображалась без необходимости, вы можете обойти проблему с флажком, используя хук 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: [], как указано выше.

person mark    schedule 17.03.2015
comment
Это работает для того, что я пытаюсь сделать. Теперь я столкнулся с другой проблемой, для которой я открою еще один вопрос, в основном создав очень похожую проблему в форме вставки. - person Randy Hall; 17.03.2015
comment
Ваша новая проблема кажется очень похожей или, возможно, такой же, как эта (показ подчиненной формы без необходимости). У меня сейчас не так много времени, но когда я что-то придумаю позже, я обновлю здесь. Вероятно, есть способ обойти это с помощью специального метода отправки вместо использования встроенной формы обновления. - person mark; 17.03.2015
comment
@RandyHall Я добавил еще одно решение, дайте мне знать, если оно работает лучше для вас. - person mark; 18.03.2015
comment
Я пришел к тому же решению! Во всяком случае, чертовски близко. stackoverflow.com/questions/29107559 / - person Randy Hall; 18.03.2015
comment
Ницца! Не заметил, что вы разместили еще один вопрос. - person mark; 18.03.2015
comment
Мне нужна ваша контактная информация, я мог бы просто заплатить вам за ответы на вопросы, лол - person Randy Hall; 18.03.2015