如何使用角度材料在下拉菜单中创建树视图?

S.M*_*iya 5 javascript typescript angular-material angular

谁能告诉我,如何在下拉菜单中创建树视图。下拉值将从 REST API 调用中以 json 形式获取,如下所示。子子级也可能包含多一级子级。

我必须在这里进行自动建议,以执行父级别和子级别的过滤器。

 VehicleList = [
      {
        parent: "audi",
        child: [{
          type: 'G-audiA',
          subchild: [{
              id: 1,
              name: 'type audi A1'
          }, {
              id: 2,
              name: 'type audi A2'
          }]
        }, {
          type: 'G-audiB',
          subchild: [{
              id: 1,
              name: 'type audi B1'
          }, {
              id: 2,
              name: 'type audi B2'
          }]
        }]
      }, {
        parent: "bmw",
        child: [{
          type: 'G-bmwA',
          subchild: [{
              id: 1,
              name: 'type bmw A1'
          }, {
              id: 2,
              name: 'type bmw A2'
          }]
        }, {
          type: 'G-bmwB',
          subchild: [{
              id: 1,
              name: 'type bmw B1'
          }, {
              id: 2,
              name: 'type bmw B2'
          }]
        }]
  }]
Run Code Online (Sandbox Code Playgroud)

任何人的帮助将不胜感激!

小智 5

基于Angular Material Tree文档中的第一个示例,我设法构建了一个内部具有树结构的下拉菜单,如下所示:

显示树的技巧是添加禁用/空选项。我用它作为标签。该树取自他们的示例,因此我根本没有修改它,您可以修改节点结构以匹配您自己的。

为了在下拉列表的标签中显示所选项目,您可以创建一个方法,该方法将返回所选项目的字符串,因为它们的SelectionModel对象具有 selected 属性,该属性将返回所有所选节点。

/** The selection for checklist */
checklistSelection = new SelectionModel<TodoItemFlatNode>(
    true /* multiple */
);
Run Code Online (Sandbox Code Playgroud)

为了从树中获取所选项目:

return this.checklistSelection.selected.map(s => s.item).join(",");
Run Code Online (Sandbox Code Playgroud)

对于过滤部分我认为你可以看看这个答案。希望这有帮助!

斯塔克闪电战

编辑:如果您选择一个子项,即使未选择其所有子项,父项也会被选中并添加到 SelectionModel 中。如果您不希望出现此行为,请对该函数进行注释descendantsPartiallySelected。这不会检查复选框,因此除非选择了所有子项,否则不会在 SelectionModel 中添加父项