Если у вас есть список observable
в вашем магазине:
@obserable public Claimslist: IClaim[] = [];
где IClaim
- интерфейс, claims
- массив IClaim
объектов
IClaim
содержит переменную в своем объекте с именем moveOutDate
Каждый объект заявки имеет переменную id
.
А теперь вы хотите обновить или получить эту переменную по claim
id
Итак, у вас есть 2 функции:
Получить
/**
* Gets the moveOutDate of a claim by claim ID
*/
@action getMoveOutDateById = (id: string) => {
// Get the claim by id
const claim = this.Claimslist.find((element: IClaim) => element.id === sessionStorage.getItem('claim-id'));
if (claim) {
if (!claim.moveOutDate) {
return undefined;
}
return moment(new Date(claim.moveOutDate)).toDate();
}
return undefined;
}
Установить
/**
* Sets moveOutDate in claim by claim ID
*/
@action public setMoveOutDate = (id: string, date: Date) => {
const claim = this.Claimslist.find((element: IClaim) => element.id === id);
if (claim) {
claim.moveOutDate = date.toString();
}
}
Окей, но теперь, когда вы сначала используете getMoveOutDateById
в вашем render
, он работает и отображает дату, но как только вы вызовете setMoveOutDate
onUpdate
компонента даты, рендер не будет обновляться, но Магазин обновится, и вы сможете увидеть изменения, только если обновите страницу.
Теперь мне удалось решить ее, выполнив:
this.Claimslist = this.Claimslist.slice();
и добавление скрытого ввода списка заявок:
const {Claimslist} = this.props.claimsStore;
и
<input type="hidden" value={Claimslist} />
Почему это происходит, если весь объект равен obserable
и заключен в @action
, почему он не изменяется без использования slice()
и скрытого ввода?