经过多次反复试验,我对如何处理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();
任何指导都非常感谢,因为我已经敲了一个多星期,我准备放弃了。
谢谢!
答案 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
的其他答案