У меня есть список элементов в моем приложении, распечатывающий их в * ngFor. Когда приложение возобновляется, я вызываю метод для загрузки новых элементов с сервера, выполняя http-Request. Внутри этого метода я устанавливаю элементы как элементы массива.
Однако массив не обновляется в представлении. Если я делаю pull-to-refresh (на котором я вызываю тот же метод), элементы в представлении обновляются.
Я попробовал обернуть часть моего кода, который переопределяет старый массив в ngZone .run()
или setTimeout()
но ничего не работает. Также пробовал с ChangeDetectorRef
, также безуспешно.
Теперь у меня нет идей...
Вот что я пробовал до сих пор:
this.zone.run(() =>{
this.posts = posts; // "posts" is the array of elements i got from http-request
// "this.posts" the array for the view
});
а также
setTimeout(() => {
this.posts = posts;
}, 10);
а также
this.posts = posts;
this.changedetectorRef.detectChanges(); //also tried markForCheck()
МОЙ КОД:
Посмотреть:
<ion-item-sliding *ngFor="let post of posts" >
<ion-item>
<p>{{post.newdistance}}</p>
</ion-item>
</ion-item-sliding>
соответствующий файл.ts:
loadPosts() {
let loading = this.loadingController.create({
content: "Einen Moment bitte...",
spinner: "crescent"
});
loading.present();
this.postsService.getPostsFromServer().then(posts => {
posts.forEach((post, index) => {
this.geolocationService.getDistance(post.latitude, post.longitude).then(distance => {
post.newdistance = distance;
});
});
this.posts = posts; // <---- what to do here ???
loading.dismiss();
})
.catch(() => {
loading.dismiss();
});
}
Помогите мне, пожалуйста!
ОБНОВИТЬ
Когда я добавляю предупреждение и сравниваю значение старого сообщения с новым, оба обновляются. Проблема, безусловно, в не обновляющемся виде
ОБНОВЛЕНИЕ 2
Я заметил, когда я добавляю кнопку в представление, на котором я вызываю ту же функцию, просмотр также обновляется... он просто не обновляется, когда я возобновляю приложение...
this.posts = posts;
часть вашего кода выполняется, возможно, до
this.geolocationService.getDistance(post.latitude, post.longitude).then(distance => {
post.newdistance = distance;
});
Я говорю "возможно раньше", потому что это обещание, вы не можете быть уверены, когда именно оно вернется. Таким образом, значение newdistance устанавливается после назначения posts
на this.posts
.
Лучший способ справиться с этим - объединить свои методы обещания, которые должны выполняться один за другим, а не параллельно.
Другой (более простой способ) заключается в том, чтобы выталкивать каждый post
в this.posts
только после того, как он получил значение newdistance. Имейте в виду, что вы должны использовать новый массив для ввода сообщений, например:
//at the top of you page declare a new postsArray variable
postsArray = [];
this.postsService.getPostsFromServer().then(posts => {
posts.forEach((post, index) => {
this.geolocationService.getDistance(post.latitude, post.longitude).then(distance => {
post.newdistance = distance;
// Here we push the new post into the posts array
this.postsArray.push(post);
});
});
loading.dismiss();
})
.catch(() => {
loading.dismiss();
});
this.posts
?
geolocationService
, но все остальные свойства объекта post также не обновляются в представлении ... просто, если я делаю тягу для обновления, она работает нормально ... я так растерялся