地图列表中的地图
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 中使用 ,所以你不得不使用
<tr template repeat="...">
抱歉,我不知道为什么必须这样做,您必须对此进行自己的研究。如果您尝试使用
进行操作,它将引发错误
<table>
<template repeat="...">
<tr><td></td></tr>
</template>
</table>
因为 不允许在 table 元素内。
至于过滤
你可以做到这一点
@observable String search = '';
filter(search) => (List row) =>
row.where((item) => item['Phone'].contains(search));
用于根据 phone
进行过滤
或筛选与搜索字符串匹配的任何值
filter(String search) => (List row) =>
row.where((Map item) => item.values.any((val) => val.toLowerCase().contains(search.toLowerCase())));
这与@pixel-elephant
的另一个答案相似
经过反复试验,我不知道如何处理 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 中使用 ,所以你不得不使用
<tr template repeat="...">
抱歉,我不知道为什么必须这样做,您必须对此进行自己的研究。如果您尝试使用
进行操作,它将引发错误<table>
<template repeat="...">
<tr><td></td></tr>
</template>
</table>
因为 不允许在 table 元素内。
至于过滤
你可以做到这一点
@observable String search = '';
filter(search) => (List row) =>
row.where((item) => item['Phone'].contains(search));
用于根据 phone
进行过滤或筛选与搜索字符串匹配的任何值
filter(String search) => (List row) =>
row.where((Map item) => item.values.any((val) => val.toLowerCase().contains(search.toLowerCase())));
这与@pixel-elephant
的另一个答案相似