如何通知 Polymer 有关对象集合中字段的更改
How to notify Polymer about changes to a field in a collection of objects
目前我有
@property List<DemoItem> demos =
[new DemoItem('a'), new DemoItem('b'), new DemoItem('c')];
...
@reflectable
void clickHandler([_, __]) {
demos.firstWhere((d) => d.name == 'b').isActive = true);
notifyPath('demos', demos);
}
...
class DemoItem extends JsProxy {
@reflectable
bool isActive = false;
@reflectable
final String name;
@reflectable
DemoElementItem(this.name);
}
html
<template is="dom-repeat" items="[[demos]]" as="demo" >
<paper-item active="[[demo.isActive]]">
<div data-demo-name$="[[demo.name]]"
on-click="clickHandler">[[demo.name]]</div>
</paper-item>
</template>
但是 <paper-item>
的 active
状态没有更新,所以这不起作用,而且看起来也不是很有效。
如何正确执行此操作?
您需要通知更改的确切路径,因为列表本身是同一个实例,否则通知实际上会被忽略。例如,这里是 clickHandler 的一个选项,虽然不是最有效的:
@reflectable
void clickHandler([_, __]) {
var demo = demos.firstWhere((d) => d.name == 'b')..isActive = true;
notifyPath('demos.${demos.indexOf(demo)}.isActive', demo.isActive);
}
目前我有
@property List<DemoItem> demos =
[new DemoItem('a'), new DemoItem('b'), new DemoItem('c')];
...
@reflectable
void clickHandler([_, __]) {
demos.firstWhere((d) => d.name == 'b').isActive = true);
notifyPath('demos', demos);
}
...
class DemoItem extends JsProxy {
@reflectable
bool isActive = false;
@reflectable
final String name;
@reflectable
DemoElementItem(this.name);
}
html
<template is="dom-repeat" items="[[demos]]" as="demo" >
<paper-item active="[[demo.isActive]]">
<div data-demo-name$="[[demo.name]]"
on-click="clickHandler">[[demo.name]]</div>
</paper-item>
</template>
但是 <paper-item>
的 active
状态没有更新,所以这不起作用,而且看起来也不是很有效。
如何正确执行此操作?
您需要通知更改的确切路径,因为列表本身是同一个实例,否则通知实际上会被忽略。例如,这里是 clickHandler 的一个选项,虽然不是最有效的:
@reflectable
void clickHandler([_, __]) {
var demo = demos.firstWhere((d) => d.name == 'b')..isActive = true;
notifyPath('demos.${demos.indexOf(demo)}.isActive', demo.isActive);
}