-2

我使用文本区域制作了这个下拉菜单,用于在角度材料对话框中输入。下拉列表中只有三个选项(到目前为止)-“英语”、“法语”和“加拿大法语”。我已经默认禁用了“英语”。现在,对于其余的选项,当我单击“添加新语言”按钮并选择一个选项(法语;比如说)并添加文本时,我可以禁用选定的选项,这样当用户添加第三种语言时,他们就不能再次选择它。它工作正常。像这样(这是没有点击保存按钮) 在此处输入图像描述 现在问题从这里开始。当我选择“法语”(比如说)并点击保存按钮时。并再次打开对话框。在添加第三种语言的选项中,我再次看到“法语”和“加拿大法语”。在此处输入图像描述

这是 ts 代码:

export class ModalAllComponent implements OnInit {

  dialogData: DialogDataModel;

  languages: any[];

  rows: any[];

  item!:any[];

  constructor(
     public dialogRef:MatDialogRef<ModalAllComponent>,
     @Inject(MAT_DIALOG_DATA) public data: DialogDataModel) {
      this.dialogData = data;
      this.rows = this.dialogData.localisedEntities.filter(lang => lang.value,)
      this.languages = this.dialogData.localisedEntities.map(item => ({ code: item.code, title: item.title, canEdit: item.canEdit }))
      console.log(this.dialogData)
    }

  ngOnInit(): void {
  }

  addNewLanguage() {
    this.rows.push({
      code: '',
      title: '',
      value: '',
      canEdit: true
    });
  }

  onChangeValue(ev: any){
    this.rows = this.rows.map(row => {
      if (row.code == ev.value) {
        const lang = this.languages.find(lang => lang.code == ev.value);
        row.title =lang.title;
      }
      return row;
    })

    console.log(this.rows)

    this.languages = this.languages.map(lang => {
      if (lang.code == ev.value) {
        lang.canEdit = false;
        console.log(lang);
      }
      return lang;
    });
    this.isDisabled()
  }

  isDisabled(){
    return this.rows.filter((item) => item.value == '' || item.code == '')
        .length > 0
        ? true
        : false;
  }

  submit(ev:any){
    this.dialogRef.close({data: this.rows});
  }

  back(){
    this.dialogRef.close()
  }

  removeBtn(index:number){
    this.rows.splice(index, 1);
  }
}

我在很多地方进行控制台日志记录,最后设法绘制到可能发生问题的这些地方。在console.log(lang)中,我看到,当我选择“French”时,标志 canEdit 变为 false。但是在 中console.log(this.rows),当我选择“French”时,标志 canEdit 没有变为 false

如何解决问题?

HTML 代码:

<div>
  <table class="justify-content-between">
    <tr *ngFor="let entity of rows; let i = index">
      <td class="col-1" *ngIf="entity.value!=null">
        <mat-select [(ngModel)]="entity.code" [disabled]="!entity.canEdit"  (selectionChange)="onChangeValue($event)">
          <mat-option *ngFor="let lang of languages" [disabled]="!lang.canEdit" [value]="lang.code">{{ lang.title }}</mat-option>
        </mat-select>
        <!-- <mat-error *ngIf="entity.code.hasError('required')">Please choose an language</mat-error> -->
      </td>
      <td class="col-1" *ngIf="entity.value!=null">
        <textarea style="height: 2rem" class="pl-5" [disabled]="!entity.canEdit" [(ngModel)]="entity.value">{{ entity.value }}</textarea>
        <mat-icon class="pl-2" style="color: red;font-size: 2rem;cursor: pointer;" (click)="removeBtn(i)">close</mat-icon>
      </td>
    </tr>
  </table>
  <div class="d-flex flex-column align-items-center mt-2">
    <button class="form-control" (click)="addNewLanguage()" *ngIf="rows.length < dialogData.localisedEntities.length" [disabled]="isDisabled()">Add new language</button>
      <div class="d-flex pt-2">
        <button class="form-control" [disabled]="isDisabled()" (click)="back()">Discard</button>
        <button class="form-control ml-4 pl-4 pr-4" [disabled]="isDisabled()" (click)="submit($event)">Save</button>
      </div>
  </div>
</div>

这是模态打开的地方:

localiseFoodName() {
    const dialogData = < DialogDataModel > {
      localisedEntities: this.foodModel.localisedName.map((item: any) => {
        if (item.code == 'en') {
          item.canEdit = false;
        } else {
          item.canEdit = true;
        }
        return item;
      }),
    };

    let dialogRef = this.dialog.open(ModalAllComponent, { width: '26.5rem', data: dialogData });

    dialogRef.afterClosed().subscribe(res => {

      if (res && res.data) {
        console.log(res)
        console.log(res.data)
        let temp:any
        this.foodModel.localisedName.map((item:any)=>{
          temp = res.data.find((element:any)=> element.code === item.code);
          if(temp){
            item.value = temp.value
            item.canEdit = temp.canEdit = false
          }
          //console.log(temp)
        })
        const food  = this.foodModel.localisedName
        console.log(food)
      }
    })
  }

当我console.log(food)能看到canEdit:false. 但是当我再次打开模式时,所选项目再次console.log(this.dialogData)canEdit“True” 在此处输入图像描述

在此先感谢您的帮助!

4

3 回答 3

0

在选择时,在函数中获取所选项目并过滤语言数组。

于 2021-10-01T07:24:21.750 回答
0

在潜入...

因为,就像你说的,这是一个大项目,我觉得它可能很难诊断,但我会根据我以前见过的事情指出我认为可能是罪魁祸首,我会更新这个答案如果更多细节/背景出现。

同时,请查看:https ://stackoverflow.com/help/minimal-reproducible-example 。

看,我知道,这都是显而易见的东西,我不是要侮辱,但是当我们专注于问题时,我们程序员经常会忘记这些事情,而提醒通常会有所帮助。最重要的是,一个最小的可重复示例可以依次帮助回答者和提问者。无论您在这方面取得什么进展,我们都深表感谢!


可能会发生什么

这个问题感觉比模板驱动的表单更适合反应式表单,但是您可以使用模板表单。您需要在附加到您的 2-wayngModel绑定的设置器中添加一些逻辑。这就是您需要更新canEdit状态的地方。

我也怀疑你的订阅。根据dialogRef.afterClosed()返回的内容(根据排放量、其来源等),您可能会在这里遇到一个挥之不去的订阅问题。订阅不会随组件而死。即使它不会导致逻辑错误,它也会使你的内存膨胀,减慢你的应用程序。

一般来说,我建议找到一种不显式订阅的方法,但看看你是否可以利用async管道并通过subject.next在事件监听代码中的特定点(即你的ngModel-bound二传手)。另一个好处是async管道为您处理订阅,但它也会在组件死亡时取消订阅。

如果这不能解决您的问题并且您能够提供更多上下文,我会回来更新。对不起,现在只是很多猜测。更多的上下文将非常有帮助!

于 2021-10-03T20:41:06.063 回答
0

而不是硬编码item.code == 'en',这样每当它看到en它就会转旗false

localiseFoodName() {
    const dialogData = < DialogDataModel > {
      localisedEntities: this.foodModel.localisedName.map((item: any) => {
        if (item.code == 'en') {
          item.canEdit = false;
        } else {
          item.canEdit = true;
        }
        return item;
      }),
    };

我刚刚检查了 item 的值是否为 null(empty) item.value != null

localiseFoodName() {
    const dialogData = < DialogDataModel > {
      localisedEntities: this.foodModel.localisedName.map((item: any) => {
        if (item.value != null) {
          item.canEdit = false;
        } else {
          item.canEdit = true;
        }
        return item;
      }),
    };
    console.log(dialogData);


    let dialogRef = this.dialog.open(ModalAllComponent, {
      width: '26.5rem',
      data: dialogData
    });


    dialogRef.afterClosed().subscribe(res => {

      if (res && res.data) {
        console.log(res.data)
         this.foodModel.localisedName.map((item:any)=>{
          this.temp = res.data.find((element:any)=> element.code === item.code);
          if(this.temp){
            item.value = this.temp.value
          }
        })
      }
    })
  }
于 2021-10-03T05:32:28.317 回答