У меня есть состояние, которое содержит коллекцию предметов:
import { State, Action, StateContext } from '@ngxs/store';
import {AddItem} from './app.actions';
export interface Item {
id: number;
name: string;
}
export interface AppStateModel {
items: Item[];
}
@State<AppStateModel>({
name: 'app',
defaults: {
items: []
}
})
export class AppState {
@Action(AddItem)
addItem(ctx: StateContext<AppStateModel>, action: AddItem){
const state = ctx.getState();
ctx.patchState({
items: [
...state.items,
{ id: action.id, name: action.name}
]
});
}
}
Мой компонент подписывается на список элементов в магазине, когда я добавляю новый элемент, который отражается в отображаемом списке (все в порядке).
Наблюдаемое поведение
Затем я связываю этот отображаемый элемент с полем input
- когда я набираю в этом поле ввода, мне кажется, что я изменяю состояние этого элемента, т. Е. Меняется и отображение элемента «Просмотр имени».
<ng-container *ngIf="app$ | async as app">
Name: <input #name />
<button (click)="addItem(name.value)">Add Item </button>
<br/>
<br/>
Items List:
<div *ngFor="let item of app.items">
View Name: <span>{{item.name}}</span>
</div>
<br/>
Items List 2 with updates:
<div *ngFor="let item of app.items">
Update Name: <input [(ngModel)]="item.name" />
</div>
</ng-container>
Это ожидаемое поведение? Я ожидал, что не увижу это изменение в списке «только для просмотра».
Или это просто тот случай, когда я делаю что-то, чего не должен был делать - я знаю, что действительно должен отправить это изменение через действие в магазин следующим образом:
Update Name: <input [ngModel]="item.name" (ngModelChange)="updateItem(item.name)" />
updateItem(value) {
this.store.dispatch(new UpdateItemAction(value));
}
Я проверяю это с
* ngxs: 3.0.1
* @angular/core: 6.0.0
Смотрите полный репозиторий здесь https://github.com/garthmason/ngxs
Спасибо!