Я работаю над некоторым приложением, в котором есть объект с некоторыми свойствами, и когда я делаю http-запрос, к этому объекту добавляются новые свойства.
this.user = {
id: 1,
name: 'John'
}
this.http.get('https://api.chucknorris.io/jokes/random')
.subscribe(joke => this.user.joke = joke);
Проблема в том, что обнаружение изменений не выполняется при отправке запроса (в этой статье говорится, что это должно выполняться до тех пор, пока я не изменяю стратегию обнаружения изменений).
Таким образом, ngOnChanges
не вызывается в дочернем компоненте, где я передал пользовательский объект и где я делаю некоторые сложные вещи, когда значение поступает с сервера.
Я приложил упрощенную демонстрацию stackblitz.
Примечание. Я знаю, что могу передать копию этого объекта при поступлении новых данных, но я думаю, что это должен быть лучший подход.
OnPush
. Если я неправильно понял статью, пожалуйста, дайте мне знать. Кстати, я также говорил о стратегии обнаружения изменений в своем вопросе, поэтому я думаю, что это еще одна причина не отмечать вопрос как дубликат. - person MTZ   schedule 22.07.2019If you modify the content of an object, Angular won't recognize.
Это просто факт. Если бы вы использовали примитивное значение, обнаружение изменений уловило бы это, но здесь мы имеем дело с объектом, и angular не подхватит изменение, пока не изменится ссылка. То же самое было бы, если бы это был массив, и вы изменили бы один объект в массиве, angular не уловил бы этого. - person AJT82   schedule 22.07.2019whenever some asynchronous operation has been performed, our application state might have changed
. Так что, должно быть, кто-то ошибся (парень, который ответил на вопрос о stackoverflow, ИЛИ парень, написавший статью). ИМО, парень, который написал вопрос о стеке, неправ, поэтому я не могу поверить, чтоIf you modify the content of an object, Angular won't recognize
. Пожалуйста, дайте мне официальную рекомендацию. - person MTZ   schedule 22.07.2019ngOnChanges
не вызывается каждый раз. - person MTZ   schedule 22.07.2019.subscribe(joke => this.user = joke);
ЭТО работает, но когда вы изменяете одно свойство, angular этого не поймает. Модифицированный stackblitz: stackblitz.com/edit/angular- 2avwx4?file=src/app/ - person AJT82   schedule 22.07.2019ngOnChanges
вызывается только в том случае, если ссылки разные. Так что я думаю, что я не заслуживаю повторяющегося тега :) - person MTZ   schedule 22.07.2019ngOnChanges
вызывается, поскольку мы меняем ссылку на объект: stackblitz.com/edit/ Вы сами попали в точку.ngOnChanges
не срабатывает, пока ссылка не изменится. Это ИМЕННО то, что говорит дубликат. вопрос в том, почему ngOnChanges не запускается, и в ответе говорится, чтоIf if you have a binding to a property of an object or item of an array, Angular will check the binding, but ngOnChanges won't be called
- person AJT82   schedule 22.07.2019ngOnChanges
, но это не так. - person MTZ   schedule 22.07.2019I thought that change detection has a one to one relationship with ngOnChanges
- person AJT82   schedule 22.07.2019ngOnChanges
. Если бы это было не так, шутка не отображалась бы в дочернем компоненте при выполнении{{user?.joke?.value}}
(здесь) - person MTZ   schedule 22.07.2019user.joke
через секунду, мы видим, что оно передается дочернему элементу, ноngOnChanges
не запускается, так как мы только что изменили свойство. Надеюсь, станет понятнее. Так что это не имеет ничего общего с http, просто как работает обнаружение угловых изменений: stackblitz.com/edit/angular-bkqeq6?file=src/app/child/ - person AJT82   schedule 23.07.2019