Я думал, что создам очень простую форму входа с привязанными к компоненту свойствами имени пользователя и пароля, которая будет выполнять следующие шаги:
- Отправить учетные данные с вызовом fetch()
- ЗАТЕМ получите содержимое JSON объекта результата ответа
- ТОГДА проверьте этот контент на предмет результата проверки на стороне сервера
Если бы учетные данные были неправильными, это изменило бы свойство компонента, которое сообщит Angular применить класс к входам имени пользователя и пароля, чтобы временно сделать их красными (используя setTimeout, чтобы изменить это обратно)
Проблема, с которой я столкнулся, заключается в том, что Angular неправильно применяет класс, и я не знал, почему. Я решил создать упрощенный тестовый проект, чтобы сузить проблему, и в итоге включение system-polyfills/when.js было причиной.
Этот код проходит через 1, 2, затем 3, устанавливает их как в свойстве компонента, так и выводит на консоль отладки. Angular правильно отображает свойство компонента, если не включен system-polyfill, и в этом случае он остановится на 1 и никогда не изменит его на 2 или 3, даже если консоль показывает, что свойство фактически изменено:
export class App {
private stateIndicator:string = "0";
public showState(state:string) {
console.log('State: ' + state);
this.stateIndicator = state;
}
public showFetchProblem() {
this.showState('1')
fetch('http://www.google.com/robots.txt',{mode:'no-cors'}).then((response:any) => {
this.showState('2')
response.text().then((value) => {
this.showState('3')
});
});
}
}
Я создал следующий плункер, чтобы продемонстрировать это поведение: =предварительный просмотр
И да, очевидные решения:
- Не включайте системные полифиллы вручную или
- Вручную включите другой полифилл Promise перед SystemJS, если вам это нужно.
Но мне все еще любопытно, почему это происходит, и, надеюсь, кто-нибудь может пролить свет на это (и, возможно, помочь решить базовую проблему).
Редактировать. Первоначальный заголовок был Why is Angular 2's template rendering misbehaving when using system-polyfills (when.js)
. Спасибо Тьерри и Гюнтеру за вклад и указание на то, что здесь играет роль использование зон в Angular 2. Для тех, кто столкнется с этим в будущем, вот две отличные статьи, которые более подробно объясняют зоны и улучшат ваше понимание этого сценария, если вы столкнетесь с ним: