html - 如何创建下拉列表并绑定(bind)来自服务器的数据

标签 html angular typescript

我对 Angular 很陌生。我有一些关于 Angular 的工作。
我需要为 Json 绑定(bind)嵌套下拉列表通过调用 Rest Api 来自服务器的数据。
数据具有一个属性级别,指定组层次结构中的级别。家长
将有立即Child=1 , Grandchild=2等等。 ChildGrandchild有 Group 字段,它显示在哪个父菜单中,子菜单将在那里。
我已经尝试过开发,但我找到了 bootstrap 的所有示例静态数据在 html文件并分开 CSS对我来说很复杂的文件。
我想使用 TypeScript 动态执行此操作.我怎样才能开始研究它。

最佳答案

这是一个编码示例,您需要根据 json 数据中的嵌套级别数据进行编码。现在你可以 for 循环 格式化 使用 在 DOM 中创建 json 数据型号 数据。
我希望这会帮助你创建一个多级下拉菜单

groupBy(xs, key) {
   return xs.reduce(function (rv, x) {
     (rv[x[key]] = rv[x[key]] || []).push(x);
    return rv;
   }, {});
 }

var model;

getData() {
 var   sampleData = {
  "ArrayOfLocationGroup": {
    "LocationGroup": [
      ...
      ...//Server response data
      ],
    "_xmlns:xsd": "http://www.w3.org/2001/XMLSchema"
  }
 }    

var list = this.sampleData["ArrayOfLocationGroup"]["LocationGroup"];
var formattedList = [];

list.forEach(element => {

  var obj = {  //Make sure your server response data to like this structure
    "Id": element.Id,
    "Name": element.Name,
    "GroupId": element.GroupId.__text,
    "ParentLocationGroup": element.ParentLocationGroup.__text,
    "LgLevel": element.LgLevel.__text,
    "Child" : []
  }
  formattedList.push(obj);
});

var groupDataList = this.groupBy(formattedList, "LgLevel");

var parents = groupDataList[0];
var child = groupDataList[1];
var childOfChild = groupDataList[2];

child.forEach(c => {
  c.Child = childOfChild.filter(x => x.ParentLocationGroup == c.Id);
})

parents.forEach(p => {
  p.Child = child.filter(x => x.ParentLocationGroup == p.Id);
})

this.model = parents;
}

html文件
    <ul class="nav site-nav">
     <li class=flyout>
      <a href=#>Dropdown</a>
      <!-- Flyout -->
      <ul class="flyout-content nav stacked">
        <li *ngFor="let parent of model" [class.flyout-alt]="parent.Child.length > 0"><a href=#>{{parent.Name}}</a>
          <ul *ngIf="parent.Child.length > 0" class="flyout-content nav stacked">
            <li *ngFor="let c of parent.Child" [class.flyout-alt]="c.Child.length > 0"><a href=#>{{c.Name}}</a>
              <ul *ngIf="c.Child.length > 0" class="flyout-content nav stacked">
                <li *ngFor="let cc of c.Child" [class.flyout-alt]="cc.Child.length > 0"><a href=#>{{cc.Name}}</a></li>
              </ul>
            </li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>

根据您的服务器响应数据组织模型数据。
响应 json 格式已更改 ( __text #text )
 var obj = {
    "Id": element.Id,
    "Name": element.Name && element.Name.#text ? element.Name.#text : element.Name,
    "GroupId": element.GroupId && element.GroupId.#text ? element.GroupId.#text : element.GroupId,
    "ParentLocationGroup": element.ParentLocationGroup && element.ParentLocationGroup.#text ? element.ParentLocationGroup.#text : element.ParentLocationGroup,
    "LgLevel": element.LgLevel && element.LgLevel.#text ? element.LgLevel.#text : element.LgLevel,
    "Child" : []
  }

关于html - 如何创建下拉列表并绑定(bind)来自服务器的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60318600/

相关文章:

javascript - 满足条件后显示警报

angularjs - 如何从 Angular2 本地存储中保存和检索数据?

webview - 如何在 Angular2 应用程序中使用 Electron 的 <webview>?

twitter-bootstrap - angular 2/bootstrap - 使用 *ngFor 的可变长度轮播

javascript - typescript 将字符串解析为数字组 345-67 以及包含单词和数字的文本

javascript - 克隆对象后更新内部 Knockout 属性不起作用

javascript - 暴露 typescript 函数以调用 html 页面

html - 如何最小化 html 表格中的列宽?

php - 未捕获的语法错误 : Unexpected token ILLEGAL (PHP & Javascript)

javascript - setTimeout() 在 angularjs 中不起作用?