地图列表中的地图

Maps in Lists in Maps

经过反复试验,我不知道如何处理 Dart 中的嵌入式列表和地图,以及如何通过 Polymer 数据绑定访问它们。 objective是读取一个JSON文件,构建一个HTMLtable,可以过滤排序。 (为了清楚起见,我只是在下面对地图数据进行了硬编码。)

我可以在我的 Polymer 元素(参见 buildTable)中构建一个 HTML table,只要地图看起来像下面 Dart 代码中看到的 testMap3 并且它可以很好地呈现:

HTML:

<p><b>The data from testMap3 after building table in Dart file:</b>/p> 
<table class="bordered" id="dataTable"></table>     

但是,我似乎无法弄清楚如何通过 Polymer 数据绑定来做到这一点。现在我只是转储 k-v 对,这样我就可以看到对象:

HTML:

<p><b>The data from testMap3 via Polymer binding:</b></p> 
<template repeat="{{key in testMap.keys}}">
  <p>{{key}} : {{testMap[key]}}</p>   
</template>

如何使用数据绑定创建一个 table 来匹配上面第一个示例的结果?为了让事情变得更加困难,我该如何使用 testMap2 来代替?

飞镖:

调用 buildTable 时渲染 testMap3 工作正常:

Map testMap3 = toObservable({
                'columns' : ["First Name", "Attending", "Phone"],
                'rows' : [{'First Name' : "Alice", 
                           'Attending' : "Yes",
                           'Phone' : "555-1212"},                              
                          {'First Name' : "Bob", 
                           'Attending' : "Yes",
                           'Phone' : "555-2323"}                              
                         ]
           });

迭代 testMap2 存在问题,因为附加的嵌入 'Phone' 值是包含另一个映射的列表:

 Map testMap2 = toObservable({
               'columns' : ["First Name", "Attending", "Phone"],
               'rows' : [{'First Name' : "Alice", 
                          'Attending' : "Yes",
                          'Phone' : [{'Home' : "555-1234",
                                      'Work' : "555-4321",
                                      'Mobile' : "555-1212"}]},                              
                         {'First Name' : "Bob", 
                          'Attending' : "Yes",
                          'Phone' : [{'Home' : "555-2345",
                                      'Work' : "555-5432",
                                      'Mobile' : "555-2323"}]}                            
                        ]
          });

以下代码适用于 testMap3,但如果我使用 testMap2,我没有尝试让我循环遍历 phone 数据。 关于如何执行此操作的任何想法?

buildTable() {

  TableElement table = this.shadowRoot.querySelector("#dataTable");
  table.children.clear();

  TableSectionElement tBody = table.createTBody();

  TableSectionElement tHead = table.createTHead();
  TableRowElement trh = tHead.addRow();

  for (var column in testMap3["columns"]) {
    var cell = new Element.tag('th');
    cell.text = column;
    trh.append(cell);
  }

  for (var row in testMap3["rows"]) {

    TableRowElement tr = tBody.addRow();
    for (var column in testMap3["columns"]) {
      tr.addCell().text = row[column];       
    }
  }   
}

最后,最终目标之一是过滤呈现的 table 中的所有列,采用类似于以下的方法...这可行吗?我似乎找不到使用地图甚至列表中的列表的示例。

HTML:

<template repeat="{{city in listOfCities | filter(searchParameter)}}">
  <li>{{city}}</li>
</template>

飞镖:

@observable List listOfCities = ["Chicago", "New York", "Los Angeles", "Dallas", "Denver"];

filter(term) => (listOfCities) => term.isEmpty ? listOfCities : listOfCities.where((item) => item.toLowerCase().contains(searchParameter.toLowerCase())).toList();

任何指导都非常感谢,因为我已经苦苦思索了一个多星期,现在正准备放弃。

谢谢!

以下聚合物数据绑定将适用于 testMap3:

<table>
  <thead>
    <tr>
      <td template repeat="{{column in testMap3['columns']}}">{{column}}</td>
    </tr>
  </thead>
  <tbody>
    <tr template repeat="{{row in testMap3['rows']}}">
      <td template repeat="{{data in row.keys}}">{{row[data]}}</td>
    </tr>
  </tbody>
</table>

过滤 table 行可以使用以下方法完成:

filter(term) => (rows) => term.isEmpty
      ? rows
      : rows.where((row) => row.values.any((val) => val.toLowerCase().contains(term)));

它查看整行数据并将每一列与搜索词进行匹配。

tbody 看起来像这样:

<tbody>
  <tr template repeat="{{row in testMap3['rows'] | filter(search)}}">
    <td template repeat="{{data in row.keys}}">{{row[data]}}</td>
  </tr>
</tbody>

它假定您有一个文本输入,该文本输入连接到一个名为 search.

的字符串值

你可以试试这个

<table>
  <thead>
    <tr>
      <th template repeat="{{item in testMap3['columns']}}">{{item}}</th>
    </tr>
  </thead>
  <tbody>
    <tr template repeat="{{row in testMap3['rows']}}">
      <td template repeat="{{key in testMap3['columns']}}">{{row[key]}}</td>
    </tr>
  </tbody>
</table>

<tr template repeat="...">

相同
<template repeat="...">

但是你不能在 table 中使用