简体   繁体   English

将值从子组件更新到垫卡中的父组件

[英]update value from child to parent component in mat card

I have a angular application and I have two components.我有一个 angular 应用程序,我有两个组件。 ONe where you can update the item.一个您可以更新项目的地方。 And a other one where the updated value has to be visible directly when the button update is been triggered.另一种情况是,当按钮更新被触发时,更新的值必须直接可见。

So I made a service like this:所以我做了这样的服务:

export class ItemListService {
  _updateItemChanged = new Subject<string>();

  constructor() {}

  get refreshNeeded() {
    return this._updateItemChanged.next();
  }
}

and the value where the value is comming from:以及值来自的值:

[appSubmitIfValid]="editItemForm" (valid)="save()" i18n>Update</button>
        <button *ngIf="!isNew" mat-raised-button color="warn" (click)="openRemoveDialog()" i18n>Remove</button>
 save(): void {
    const form = this.editItemForm;
    const dossierItemDto: DossierItemPostDto = {
      title: form.controls.title.value,
      itemType: form.controls.itemType.value,
      date: (form.controls.date.value as moment.Moment).format('Y-MM-DD'),
      body: form.controls.body.value
    };

    form.disable();

    if (!this.isNew) {

      this.dossierItemService.updateDossierItemById(this.dossier.id, this.item.id, dossierItemDto)

        .subscribe(item => {
          this.item = item;
          this.sortDossierItems();
          form.enable();
          form.markAsPristine();
          this.itemListService._updateItemChanged.next(this.item.title);
          this.errorProcessor.openSuccessSnackBar($localize`Item is saved`);
        }, error => this.handleError(error));
    } else {
      this.dossierItemService.newDossierItem(this.dossier.id, dossierItemDto)
        .subscribe(item => {
          this.item = item;
          this.dossierItems.unshift(item);
          this.sortDossierItems();
          this.isNew = false;
          form.enable();
          form.markAsPristine();
          this.errorProcessor.openSuccessSnackBar($localize`Item is saved`);
        }, error => this.handleError(error));
    }
  }

and the component that has to been updated(parent):以及必须更新的组件(父):


  dossierItems: DossierItemDto[] = [];

ngOnInit(): void {
     this.itemlistService._updateItemChanged.subscribe((data) => {
     data =   this.dossierItems.map(a => a.title) ;
    });

But I get now this error:但我现在得到这个错误:


Type 'string[]' is not assignable to type 'string'.ts(2322)

So what I have to change?那么我必须改变什么?

Thank you谢谢

oke, and this value has to be updated: the item.title.好的,这个值必须更新:item.title。

<ng-template #itemList let-itemType="itemType">
  <mat-card *ngFor="let item of dossierItemsBy(itemType); let i = index" class="dossier-item-view">
    <mat-card-header>
      <mat-card-title>
        <span [innerHTML]="item.title | highlight: searchQuery"></span>
        <span class="spacer"></span>
        <span><app-attachment-links [attachments]="item.attachments" [dossierId]="dossier.id" ></app-attachment-links></span>
      </mat-card-title>

      <div class="mat-card-header-text">
        <span *ngIf="!createdAtEqualsDate(item)"
          >{{ item.date | date: 'shortDate' }}<ng-template i18n>created</ng-template></span
        >
        <span>{{ item.createdAt | date: 'short' }}</span>
        <span *ngIf="item.createdAt !== item.lastModifiedAt"
          ><ng-template i18n>modified</ng-template> {{ item.lastModifiedAt | date: 'short' }}</span
        >
      </div>
      <span>
        <a mat-icon-button [routerLink]="['../', dossier.id, 'item', item.id]" routerLinkActive="active-link"
        [routerLinkActiveOptions]="{exact:true}"
         i18n-title title="Edit">
          <mat-icon>edit</mat-icon>
        </a>
      </span>
    </mat-card-header>
  </mat-card>
</ng-template>


  dossierItemsBy(itemType: DossierItemTypeDto) {
    return this.dossierItems.filter(
      i => i.itemType === itemType && (!this.hasSearchQuery || this.itemSearchMatches[i.id].hasMatch)
    );
  }

You wrote that in subject pass string您在主题密码字符串中写了

_updateItemChanged = new Subject<string>();

And in subscribe you try to assign an array of strings to it订阅中,您尝试为其分配一个字符串数组

this.itemlistService._updateItemChanged.subscribe((data) => {
 data =   this.dossierItems.map(a => a.title) ;
});

If you want to update your parent , why not use Output ?如果你想更新你的父母,为什么不使用Output呢?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM