地图列表中的地图

时间:2015-01-28 01:41:14

标签: dart dart-polymer

经过多次反复试验,我对如何处理Dart中的嵌入式列表和地图以及如何通过Polymer数据绑定访问它们感到很遗憾。目标是读取JSON文件并构建可以过滤和排序的HTML表。 (为了清楚起见,我只是在下面对地图数据进行了硬编码。)

我可以在我的Polymer元素中构建一个HTML表格(请参阅buildTable),只要Map看起来像下面的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>

如何使用数据绑定创建一个与上面第一个示例的结果相匹配的表?为了使事情变得更加困难,我怎样才能使用testMap2呢?

落镖:

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

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时遍历手机数据。 关于如何做到这一点的任何想法?

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];       
    }
  }   
}

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

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();

任何指导都非常感谢,因为我已经敲了一个多星期,我准备放弃了。

谢谢!

2 个答案:

答案 0 :(得分:2)

以下Polymer数据绑定适用于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>

可以使用以下方法完成对表行的过滤:

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的String值。

答案 1 :(得分:1)

你可以试试这个

<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="...">

但您无法使用&lt; template&gt;在表格内,所以你被迫使用

<tr template repeat="...">

抱歉,我不知道为什么要这样做,你必须自己做研究。如果您尝试使用

执行此操作,则会抛出错误
<table>
    <template repeat="...">
        <tr><td></td></tr>
    </template>
</table>

as&lt; template&gt;表元素中不允许使用。

至于过滤

你可以这样做

@observable String search = '';

filter(search) => (List row) =>
    row.where((item) => item['Phone'].contains(search));

基于手机进行过滤

或过滤任何与搜索字符串匹配的值

filter(String search) => (List row) =>
    row.where((Map item) => item.values.any((val) => val.toLowerCase().contains(search.toLowerCase())));

类似于@ pixel-elephant

的其他答案