【问题标题】:Angular does not wait for <p-dialog> user confirmation while running in loopAngular 在循环运行时不等待 <p-dialog> 用户确认
【发布时间】:2021-07-09 22:43:45
【问题描述】:

我正在尝试实现复制粘贴操作,如果用户选择粘贴多个项目,并且如果目标文件夹中存在文件名,则应出现对话框,用户应输入该项目的新名称并继续粘贴。

然而 Angular 并没有等待盒子打开并且不允许用户输入新名称,而是在最后打开。

https://stackblitz.com/edit/primeng-tree-demo-96zfra?file=src%2Fapp%2Fapp.component.ts

这是我的代码:

for (let i = 0; i < this.pasteFiles.length; i++) {
let ispresent = this.checkIfFileExist(file);
if (ispresent) {
this.dataService.setfilepath(file.newFilePath + '/' + file.pasteFileName);
this.callpastedialog(); //this.display=true; dint work
} else {
this.mainpaste(file);
}


callpastedialog(){   //tried to call it in seperate fun but no use
this.display=true;
}

html:

<p-dialog [(visible)]="display">
.....
</p-dialog>

解决此类问题的方法是什么?

【问题讨论】:

  • 相当肯定一个异步函数必须返回一个 Promise
  • 不需要异步

标签: angular typescript primeng


【解决方案1】:

我从未在 Angular 中尝试过 async/await,但你为什么不使用递归函数来代替你的用例

getNextFileToProcess() {
  const file = this.pasteFiles.shift();
  if (file) {
    if (fileExists()) {
      showPopup();
      whenActionComplete() {
        getNextFileToProcess();
      }
    } else {
      processFile();
      getNextFileToProcess()
    }
  } else {
    // processing complete
  }
}

【讨论】:

  • 我发现在循环中使用很容易,但这里的问题是一个一个打开对话框风,如何解决?
  • 我看不出任何原因,为什么即使 async/await 可以工作,for 循环也会等待。因为您的函数 callpastedialog() 只是设置一个变量,并且该函数会立即完成,从而导致 for 循环处理下一项。并且由于 JavaScript 在单线程中运行,只有当所有项目都完成处理后,才会打开弹出窗口。
  • 您所期望的行为类似于 confirm() 的工作方式,创建一个自定义模式组件来模仿该行为将是 IMO 相当多的工作。
  • 你的意思是不能让它与 p-dialog 一起工作?
  • 我认为您无法通过 p-dialog 实现它。有 ConfirmDialog 可能在一定程度上有所帮助,但这将类似于浏览器的 confirm() 实现。但是,如果您想构建自定义行为,可以查看 ConfirmService 实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多