如何通知 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);
}