Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Как отследить изменение переменной в компоненте Angular 2+? (https://javascript.ru/forum/angular/73397-kak-otsledit-izmenenie-peremennojj-v-komponente-angular-2-a.html)

Shitbox2 12.04.2018 12:58

Как отследить изменение переменной в компоненте Angular 2+?
 
Нужно следить за изменением переменной в компоненте и вызывать колбэк. Если в первом Ангуляре это делалось с помощью watch, то во втором не ясно как делать.

Либо вызывать в разных местах (на ngModelChange, на click кнопки и т.д. там где меняется переменная)
Либо делать отдельный компонент, запихивать эту переменную ему в параметры и обрабатывать с помощью геттеров и сеттеров
Либо сделать проверку в ngDoCheck с использованием differ и т.п.

Все не особо удобные. Есть другие способы?

http://plnkr.co/edit/2QttX9f2UiuxPL2IEx9X?p=preview

destus 12.04.2018 15:13

Shitbox2,
Observable?

Shitbox2 12.04.2018 16:17

Да, Observable. А как? Придется использовать Reactive Form, что не очень хотелось бы. Если есть собственные компоненты, то их так же придется интергрировать в ангуляровские формы. Как это без Reactive Form сделать?

destus 12.04.2018 20:20

Shitbox2,
Можно просто сказать что переменная - это Subject. Кому надо - подпишутся. А при изменении данных через метод next прокидывать новое значение и все "подписчики" получат уведомдение.
Может есть какой-то конкретный пример?

Shitbox2 13.04.2018 18:35

Конкретный пример только тот, что в ссылке в первом сообщении.

Но, в общем, ситауция весьма распространенная. У нас есть какая-то форма. Мы её можем заполнять как ручками, так и брать информацию из query-параметров адресной строки или из шаблона, например. Т.е. есть несколько способов заполнения. Так же в форме у нас есть некая логика, зависящая от состояния определенных полей. Например, выбираем страну - появляется список городов, выбираем город - появляется список улиц, выбираем улицу и ставим какую-то галочку - появляются ещё поля. Заполняем всё это - отправляем форму.

Тут, конечно, напрашивается реактивный подход и, соответственно, использование реактивных ангуляровских форм, но это уже попахивает переусложнением. В этом случае повесить на переменную обсервер видится наиболее предпочтительным вариантом. UI будет синхронизироваться с состоянием автоматически, но в то же время мы сможем прозрачно работать с переменными и аякс-запросами как с потоками и пилить на них логику.

Как просто сказать, что переменная это Subject?

destus 13.04.2018 19:09

Shitbox2,
Не понимаю какое переусложнение будет, если взять за основы реактивные формы. Я бы так и сделал.
Цитата:

Как просто сказать, что переменная это Subject?
const variable = new BehaviorSubject(initialValue);

Shitbox2 13.04.2018 19:46

И как это поможет? ngModel не понимает таких переменных
<input [(ngModel)]="variable">


Переусложнение, потому что и по коду больше писанины и более глубокое понимание Англуляра требуется и динамические формы не так очевидно делаются. В общем, написать-то можно но потом с поддержкой замучаешься.

P.S. Тут только что-то подобное может подойти
makeObservable(this.value).subscribe(...)

Но поддерживает ли Angular/rx такое из коробки?

destus 16.04.2018 07:59

Shitbox2,
http://plnkr.co/edit/CsQHAQlDSbT4mZeG730M?p=preview

Shitbox2 16.04.2018 09:17

Ну, тут тоже переменная никак не обозревается. Всё на геттерах и сеттерах построено

destus 16.04.2018 09:20

Shitbox2,
Цитата:

тут тоже переменная никак не обозревается
?...это же Observable, значит можно подписаться и получать уведомления. Строка 23 для чего?


Часовой пояс GMT +3, время: 19:56.