当前位置: 首页 > 知识库问答 >
问题:

只在第二次点击提交时获取结果

常博裕
2023-03-14

我正在尝试更改角7的密码功能,

从后端端,如果当前密码不正确,它将返回true。

在角度侧,将显示错误消息。

但问题是我必须点击两次显示错误信息,甚至我可以看到日志打印真实值的响应,但不确定为什么*ngif不工作

模板侧

    <span *ngIf="hasError">
         wrong current password value  
    </span>

我的组件方面

hasError: boolean;

 submit () {
     this.apiService
    .changePassword(this.formGroup.value).subscribe(res => {
  console.log(res);
  this.hasError = res;    });

服务方

  changePassword(body: any){
     return this.http.post<any>(this.url + 'changePassword', body);
  }

有人能解释一下为什么我必须点击提交按钮两次才能显示html元素吗

谢谢

共有2个答案

宇文飞羽
2023-03-14

这就是你问题的原因

hasError:布尔值;

您正在启动变量,但在开始时没有给出任何值。因此,一旦加载了组件,hasError的值就会变为未定义/null。因此,它将只加载具有该值的模板。

如何防止这种情况:

方法1)(非首选)

// If you dont want to initiate the value in the component.ts file, make this change in 
  the HTML file, 

<span *ngIf="!!hasError">
         wrong current password value  
</span>


the '!!' will check for null status of the variable 

方法2)首选

// Initiate the value of the variable to false, 

// In component.ts file

hasError: boolean = false; // IMPORTANT

and then your code remains the same. 

So the initial value will now be false, and also when the service is subscribed, you can have it true or false and your HTML also remains the same. 

子车英达
2023-03-14

我怀疑您通过了changeDetection:ChangeDetectionStrategy。组件装饰器中的OnPush。在这种情况下,直到下一个变化检测周期(在您的情况下,在第二次单击时发生)时,角度传感器才会读取变化。

为了解决这个问题,您需要在构造函数中注入ChangeDetectorRef,并手动调用更改检测周期。类似的东西:

  constructor(private cdr: ChangeDetectorRef) {}
  
  hasError: boolean;

  submit () {
     this.apiService
    .changePassword(this.formGroup.value)
    .subscribe(res => {
       console.log(res);
       this.hasError = res;    
       this.cdr.markForCheck();  // <<<---- detect changes
  });

虽然使用ChangeDetectorRef没有坏处,但解决这个问题的另一种方法是使用可观测数据和角异步管道。

  hasError$: new Subject();

  submit () {
    this.apiService
    .changePassword(this.formGroup.value)
    .subscribe(res => this.hasError$.next(res));

在模板中:

  <span *ngIf="hasError$ | async">
       wrong current password value  
  </span>
 类似资料:
  • 问题内容: 我正在开发我的第一个android计算器应用程序。我陷入一个单一的缺陷。我添加了几个按钮,然后单击这些按钮,它将把各自的文本放在“ 字段”上。主要问题描述如下:在运行项目时,必须单击两次按钮才能将相应的文本首次放置在字段上。例如,单击时将“ 1”放在字段上。在运行时,首先单击该按钮无效。仅在第二次单击时,它将“ 1”放在字段上。 该守则如下: XML按钮和EditField, Main

  • 我正在制作井字游戏应用程序,第一次点击按钮后,它会得到“O”或“X”文本,我想避免第二次点击,就像我想让它免受第二次点击一样 到目前为止,我得到了这个,

  • 我正在尝试在React中构建我的第一个计算器。我的纽扣似乎有问题(我想)。在测试s时,我发现我第一次点击添加按钮不会更新所有setState。相反,第二次单击会正确更新它。 知道它为什么不起作用吗? 我有一个名为“DaInserting”的div,当用户点击任何数字键时会更新,然后当用户点击加法/减法/等时,应该更新,但它没有。它在第二次点击时更新:-检查。 当用户点击加法/减法后,DaInser

  • 问题内容: 我有一个简单的AJAX表单,该表单可以在提交时正常运行。但是,如果我随后将新数据输入相同的表单(而不刷新页面),则它将提交两次表单。如果我第三次这样做,那么它将第三次提交表单,依此类推。为什么这样做呢?这是我的代码: 问题答案: 即使我在开发AJAX登录表单时也遇到了同样的问题。搜寻了几个小时后,我找到了解决方案。希望这对您有所帮助。 基本上,您必须在ajax请求完成后 取消绑定 表单

  • 任何人都知道当用户第二次单击按钮时如何显示间隙广告。我的意思是,当用户单击一次按钮时,广告不应出现,但每当用户再次单击同一按钮时,广告必须显示。。 这里显示了我在不同活动中调用的中间代码。