Я добавил эти методы в свой древовидный компонент. Обратите внимание, что я использую плоское дерево, это не будет работать для вложенного дерева.
@Component({
selector: 'es-outline-tree',
// ...
})
export class OutlineTreeComponent implements OnInit {
treeControl: FlatTreeControl<FlatTreeNode>;
// other code...
/**
* Recursively expand all parents of the passed node.
*/
expandParents(node: FlatTreeNode) {
const parent = this.getParent(node);
this.treeControl.expand(parent);
if (parent && parent.level > 0) {
this.expandParents(parent);
}
}
/**
* Iterate over each node in reverse order and return the first node that has a lower level than the passed node.
*/
getParent(node: FlatTreeNode) {
const { treeControl } = this;
const currentLevel = treeControl.getLevel(node);
if (currentLevel < 1) {
return null;
}
const startIndex = treeControl.dataNodes.indexOf(node) - 1;
for (let i = startIndex; i >= 0; i--) {
const currentNode = treeControl.dataNodes[i];
if (treeControl.getLevel(currentNode) < currentLevel) {
return currentNode;
}
}
}
}
Я планирую создать свой собственный FlatTreeControl
(путем расширения Angular CDK FlatTreeControl
) и перемещения эта логика там.
UPDATE
Я переместил вышеуказанную логику в свою собственную реализацию FlatTreeControl
:
import { FlatTreeControl } from '@angular/cdk/tree';
export class CustomTreeControl<T> extends FlatTreeControl<T> {
/**
* Recursively expand all parents of the passed node.
*/
expandParents(node: T) {
const parent = this.getParent(node);
this.expand(parent);
if (parent && this.getLevel(parent) > 0) {
this.expandParents(parent);
}
}
/**
* Iterate over each node in reverse order and return the first node that has a lower level than the passed node.
*/
getParent(node: T) {
const currentLevel = this.getLevel(node);
if (currentLevel < 1) {
return null;
}
const startIndex = this.dataNodes.indexOf(node) - 1;
for (let i = startIndex; i >= 0; i--) {
const currentNode = this.dataNodes[i];
if (this.getLevel(currentNode) < currentLevel) {
return currentNode;
}
}
}
}
Это не то, как LIKE
работает, и как SELECT
работает. Вместо этого:
SELECT first_name, last_name FROM customerform WHERE email LIKE '%.com'
Здесь %
означает «начинается с» или «бла-бла-бла» на более случайном языке.
Помните, что такие вещи, как SELECT
полностью документированы, и нет ничего постыдного в том, чтобы проверить, как они работают, прежде чем выполнять ваше утверждение. Нам всем нужно проверить, что мы делаем это правильно.