updateChildren(model, modes) {
model.get('children').forEach(child => {
if (child.has('children')) {
modes.forEach(mode => this[mode.actionName](child, mode));
this.applyTreeModes(child, modes);
}
});
},
setCollapsed(model, options) {
const { value, expandedConfiguration, save, reqres } = options;
const currentValue = (typeof value === 'boolean') ? value : NavigationItemFactory.getCollapsed(expandedConfiguration, model.get('id'));
model.set('collapsed', currentValue);
if (save) {
reqres.request('configuration:collapsed:save', model);
}
},
setCurrentEdited(model, options) {
const { value } = options;
model.set('currentEdited', value);
},
setChecked(model, options) {
const { value } = options;
model.set('checked', value);
},
setFilterChecked(model, options) {
const { value, filter } = options;
if (filter.length === 0 || filter.indexOf(model.get('id')) !== -1) {
model.set('checked', value);
}
},
formSelectedConfiguration(model, options) {
const { selectedConfiguration } = options;
if (model.get('checked')) {
selectedConfiguration.push(model.get('id'));
}
}
Модуль для обработки древесной структуры.
Вынесен отдельно, требуется переиспользование кода.
async __editMode() {
this.model.set('editMode', !this.model.get('editMode'));
const editMode = this.model.get('editMode');
if (editMode) {
await this.reload({ editMode: editMode });
TreeService.updateChildren(this.model, [
{ actionName: 'setFilterChecked', value: true, filter: this.configuration.selectedConfiguration || [] },
{ actionName: 'setCurrentEdited', value: true },
{ actionName: 'setCollapsed', value: false, save: true, reqres: this.reqres }
]);
} else {
const selectedConfiguration = [];
TreeService.updateChildren(this.model, [
{ actionName: 'setCurrentEdited', value: false },
{ actionName: 'formSelectedConfiguration', selectedConfiguration }
]);
this.__applyConfigurationChanges(selectedConfiguration, false);
}
}
Пример использования модуля.
Хотелось бы получить оценку с точки зрения:
- дальнейшей поддержки кода (другим разработчиком)
- масштабируемости
- скорости
Что происходит в модуле?
Нужно пройти по children и произвести действия с каждым child (операции не зависимы)
Передается узел дерева / массив. Для каждого child применяются все методы обработки из массива на 1 итерации DFS.
Массив содержит в себе:
- actionName для выбора метода обработки child
- options для child