YMapComplexEntity
ComplexEntity — cущность, которая может содержать в себе дочерние компоненты, но методы для добавления и удаления в поддерево являются внутренними.
В модуле ymaps3 существует абстрактный класс YMapComplexEntity, который наследуется от YMapEntity, поэтому имеет все его свойства и методы. Также имеет дополнительные методы для работы с собственным поддеревом. Создать компонент сущности типа Complex Entity можно с помощью наследования от класса YMapComplexEntity:
type YMapSomeLayerProps = {
visible: boolean;
source: string;
};
class YMapSomeLayer extends ymaps3.YMapComplexEntity<YMapSomeLayerProps> {
private _dataSource?: YMapTileDataSource;
private _layer?: YMapLayer;
constructor(props: YMapSomeLayerProps) {
super(props);
const {source, visible} = this._props;
// Создаем экземпляры дочерних сущностей.
this._dataSource = new ymaps3.YMapTileDataSource({id: source});
this._layer = new ymaps3.YMapLayer({source, type: 'ground'});
// Добавляем дочерние сущности в собственное поддерево компонента.
this.addChild(this._dataSource);
if (visible) {
this.addChild(this._layer);
}
}
protected _onUpdate(propsDiff: Partial<YMapSomeLayerProps>): void {
if (propsDiff.visible !== undefined) {
// Удаляем или добавляем сущность в зависимости от значения visible.
propsDiff.visible ? this.addChild(this._layer) : this.removeChild(this._layer);
}
}
}
В примере выше использовались методы для взаимодействия с собственным поддеревом. Метод addChild – добавляет стороннюю сущность в поддерево. Все дочерние сущности хранятся в массиве children, поэтому в качестве второго необязательного аргумента метод принимает порядковый номер на место которого добавится сущность в этот массив. Метод removeChild – удаляет дочернюю сущность из поддерева.
Для получения списка дочерних элементов существует readonly массив children.
Также конструктор класса YMapComplexEntity имеет второй необязательный аргумент options — объект со следующими свойствами:
children– массив дочерних сущностей, которые будут добавлены в поддерево сразу после инициализации экземпляра класса.container– еслиtrue, то создает дочерний proxy-контейнер который будет содержать поддерево дочерних компонентов. По умолчанию proxy-контейнер не создается.
Подробнее про proxy-контейнеры рассказано в соответствующем разделе.