Угловая схема формы destroyStrategy работает только с братьями и сестрами, которые являются массивом объектов. Это не работает на других братьев и сестер
Я не добился успеха в том, чтобы заставить стратегию уничтожения воздействовать на любые родственные свойства или родственные объекты. Работает только на одном объекте. Пожалуйста, проверьте этот пример:
$scope.schema = {
"type": "object",
"properties": {
"propertyOne": {
"type": "string",
"enum": ["option1", "option2"],
"title": "Property One Select"
},
"propertyTwo": {
"type": "string",
"enum": ["option3", "option4"],
"title": "Property Two Select"
},
"objectOne": {
"type": "object",
"properties": {
"objectOnePropertyThree": {
"type": "string",
"enum": ["option5","option6"],
"title": "Property Three Select"
}
}
},
"arrayOfObjects": {
"type": "array",
"items": {
"type": "object",
"properties": {
"arrayObjectPropertyFour": {
"type": "string",
"enum": ["option7","option8"],
"title": "Property Four Select"
}
}
}
}
},
"required": ["propertyOne"]
};
$scope.form = [{
"key": "propertyOne"
}, {
"key": "propertyTwo",
"condition": "model.propertyOne === \"option1\""
},{
"key": "objectOne.objectOnePropertyThree",
"condition": "model.propertyOne === \"option1\""
},{
"key": "arrayOfObjects",
"condition": "model.propertyOne === \"option1\""
},
{
"type": "submit",
"title": "Save"
}];
http://jsfiddle.net/mutharasus/dp18a70b/ Здесь, если вы выберете первый выпадающий список "Option1", то выберите все остальные выпадающие списки и сохраните. Затем вернитесь и переключите первый выпадающий список на "Option2" и сохраните, чтобы увидеть, что только последний массив объектов удаляется с помощью стратегии уничтожения.
Я что-то не так делаю или это ошибка в форме angular-schema? Я посмотрел под проблемами, которые в настоящее время открыты в проекте github, и я не вижу открытой проблемы по этому поводу.
1 ответ
Вы правы, в настоящее время он ведет себя не так, как вы ожидаете, когда отдельное поле удаляется из представления из-за условия.
Вот что происходит: в "старых" пакетных декораторах для ASF каждый декоратор типа поля отображается на странице во внешнем теге. Содержимое соответствующего шаблона поля затем обрабатывается и обрабатывается. Логика условий применяется ко всему внутри тега, но не к самому тегу. Обычно это было бы хорошо, но логика destroyStrategy была назначена событию $destroy для тега. Конечным результатом является то, что событие $destroy никогда не сработает, если весь тег не будет удален из DOM. Вот почему значения модели в массиве объектов очищаются - контейнер удаляется при сбое условия "model.propertyOne === 'option1'", которое приводит к каскадному событию $destroy для каждого объекта в массиве.
Я думаю, что это упустили из виду при создании и выпуске нового компоновщика, потому что я поднял проблему в конце PR для этой функции ( https://github.com/Textalk/angular-schema-form/pull/371).
С другой стороны, новый подход к сборщику (который можно использовать, добавив файл начальной загрузки-декоратора с https://github.com/Textalk/angular-schema-form-bootstrap), не имеет этой проблемы. Вместо этого логика destroyStrategy применяется через директиву к полям формы, поскольку тег больше не используется. Если у вас нет необходимости оставаться со старыми декораторами в это время, я предлагаю взять новых и попробовать их.
Дайте нам знать, как это идет!