Угловая схема формы 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 применяется через директиву к полям формы, поскольку тег больше не используется. Если у вас нет необходимости оставаться со старыми декораторами в это время, я предлагаю взять новых и попробовать их.

Дайте нам знать, как это идет!

Другие вопросы по тегам