В моем приложении Angular2, написанном на Dart, есть несколько сервисов, которые отслеживают данные, совместно используемые компонентами, которые не обязательно имеют какое-либо конкретное отношение в представлении. Мне нужно, чтобы обновления, инициированные каким-либо компонентом, отражались на дисплее каждого компонента, я хочу, чтобы преимущества производительности OnPush
обнаруживали изменения, мне нужно, чтобы компоненты отображали значения, которые могли быть установлены до того, как компонент был создан, и я хочу, чтобы все это было выполнено с минимальным шаблоном.
Мое исследование показывает, что Observables может быть тем, что мне нужно, но я не смог найти четких ответов по нескольким вопросам.
Есть ли реализация Observable в Dart, которая хорошо работает с Angular2?
Отличается ли Observable от Dart Stream? В частности, поддерживает ли Observable получение текущего значения в дополнение к уведомлению о будущих обновлениях?
И последнее, но не менее важное: если предположить, что Observable соответствует моим требованиям, то каким будет минимальный синтаксис для объявления свойства Observable String компонента, его инициализации с помощью Observable, полученного из внедренной службы, отображения его значения в шаблоне компонента (начиная с предварительного -существующее значение), и наличие обновлений его значения автоматически помечает компонент для обнаружения принудительных изменений?
Если Observable не работает для этого, как еще мне это сделать? Моя текущая идея заключается в использовании пользовательского подкласса Stream
, который вставляет самое последнее значение перед всем остальным, что получает новый прослушиватель, и отправляет его через канал async
для обработки извлечения значений из потока и пометки для обнаружения изменений.
Мое идеальное решение будет выглядеть примерно так:
@Injectable()
class MyService {
@observable int health;
}
@Component(
...)
class MyComponent {
@observable int health;
MyComponent(MyService service) : health = service.health;
}
И в шаблоне:
<span>{{health | async}}</span>
Или для действительно идеального, хотя это должно было бы каким-то образом подключиться к компиляции шаблона Angular (может быть, с преобразователем? Я еще не узнал, как они работают):
<span>{{health}}</span>
И только с этим, это просто сработает.
Пользовательское решение, которое у меня сейчас работает, не так удобно, но близко к этому.