Как я могу прослушивать изменения свойств объектов внутри списка с помощью полимерного дротика?

У меня есть список объектов (например, людей), и я динамически добавляю и удаляю из списка. Я хочу запустить запрос по списку, когда определенное свойство изменяется для любого элемента в списке.

Например, я хочу знать, изменилось ли свойство «signedAgreement» какого-либо объекта в списке. Я не хочу вручную прикреплять слушателей к каждому объекту, я просто хочу запросить список. Как я могу это сделать?

Мой код:

library my_element;

import 'package:polymer/polymer.dart';
import 'dart:html';
import 'models.dart';

@CustomTag("my-element")
class MyElement extends PolymerElement with ObservableMixin {
  final List people = toObservable([]); // observe adds/removes to the list
  final Person newPerson = new Person();

  // How can I know when to re-evaluate signedCount?

  int get signedCount => people.where((Person p) => p.signedAgreement).length;

  void save(Event e, var detail, Node target) {
    people.add(new Person.from(newPerson));
    newPerson.blank();
  }
}

И мой объект модели выглядит так:

library models;

import 'package:polymer/polymer.dart';

class Person extends Object with ObservableMixin {
  @observable String name;
  @observable bool signedAgreement = false;

  Person();

  Person.from(Person other) {
    name = other.name;
    signedAgreement = other.signedAgreement;
  }

  blank() {
    name = '';
    signedAgreement = false;
  }
}

person Seth Ladd    schedule 25.09.2013    source источник


Ответы (1)


Введите: ListPathObserver!

Добавьте этот конструктор:

  MyElement() {
    ListPathObserver observer = new ListPathObserver(people, 'signedAgreement');
    observer.changes.listen((_) => notifyProperty(this, const Symbol('signedCount')));
  }

Здесь observer срабатывает, когда у любого человека в people изменяется свойство signedAgreement.

Затем в обратном вызове мы уведомляем систему наблюдения, что она должна посмотреть signedCount.

person Seth Ladd    schedule 25.09.2013
comment
ListPathObserver помечен как устаревший - как это сделать по-новому? - person mpg; 14.11.2014