【问题标题】:Angular 2 - Expression has changed after it was checkedAngular 2 - 检查后表达式已更改
【发布时间】:2017-05-08 02:06:42
【问题描述】:

当通过子组件的多个指令传递对象时,我收到以下错误消息:

表达式在检查后发生了变化。以前的值:“真”。当前值:'false'。

模板:

<form *ngIf="deliveryrequest" [formGroup]="deliveryRequestForm" (ngSubmit)="onSubmit(deliveryRequestForm)">
    <h4>Detail: {{deliveryrequest.nr}}</h4>
    <div class="row">
        <div class="col-lg-6 col-xs-12 col-md-6 col-sm-6">
            <drr-request [request]="deliveryrequest" [group]="deliveryRequestForm"></drr-request>
            <drr-received [received]="deliveryrequest" [group]="deliveryRequestForm"></drr-received>
        </div>
        <div class="col-lg-6 col-xs-12 col-md-6 col-sm-6">
            <drr-requester [requester]="deliveryrequest" [group]="deliveryRequestForm"></drr-requester>
        </div>
    </div>

    <div class="row">
        <div class="col-lg-12 col-xs-12">
            <button type="submit" class="btn btn-primary" [disabled]="!deliveryRequestForm.valid">Bewaren</button>
        </div>
    </div>
</form>

请求者组件模板:

<div [formGroup]="requesterForm">
    <div class="row">
        <div class="col-lg-12 col-xs-12 col-md-12 col-sm-12">
            <div class="panel panel-default">
                <div class="panel-heading">Aanvrager</div>
                <div class="control-group">
                    <drr-person [required]="true" (isMinorEmittor)="setPersonIsMinor($event)" [group]="requesterForm"></drr-person>
                </div>
            </div>
        </div>
    </div>
    <div class="row" formArrayName="responsiblePersonsNationalNumbers">
        <div class="col-lg-6 col-xs-12 col-md-6 col-sm-6"
             *ngFor="let responsible of requesterForm.controls.responsiblePersonsNationalNumbers.controls; let i=index; trackBy:i">
            <div class="panel panel-default">
                <div class="panel-heading">Verantwoordelijke {{i + 1}}</div>
                <div class="control-group" [formGroupName]="i">
                    <drr-person [required]="i === 0" [group]="requesterForm.controls.responsiblePersonsNationalNumbers.controls[i]"></drr-person>
                </div>
            </div>
        </div>
    </div>
</div>

人物组件模板:

<p-growl [value]="msgs"></p-growl>
<div [formGroup]="personForm">
    <div class="row">
        <div class="col-lg-5">
            <label>Rijksregisternummer</label>
        </div>
        <div class="col-lg-7">

            <div [ngClass]="{ 'has-error': personForm.controls.nationalnumber.invalid, 'has-success': personForm.controls.nationalnumber.valid, 'has-feedback': true }">
                <input type="text" 
                       class="form-control"
                       data-mask="99.99.99-999.99"
                       placeholder="99.99.99-999.99"
                       (keyup)="lookupPerson($event)"
                       aria-describedby="inputSuccess2Status">
                <span class="glyphicon form-control-feedback" [ngClass]="{ 'glyphicon-ok' : personForm.controls.nationalnumber.valid, 'glyphicon-remove' : personForm.controls.nationalnumber.invalid }" aria-hidden="true"></span>
                <div id="inputSuccess2Status" class="sr-only">
                    <span *ngIf="personForm.controls.nationalnumber.valid">(success)</span>
                    <span *ngIf="personForm.controls.nationalnumber.invalid">(error)</span>
                </div>
            </div>
            <div *ngIf="personForm.controls.nationalnumber.dirty && !personForm.controls.nationalnumber.valid">
                <p *ngIf="personForm.controls.nationalnumber.errors" class="text-danger">
                    {{formErrors.nationalnumber}}
                </p>
            </div>
            <!--due to data-mask not passing value-->
            <input type="hidden" formControlName="nationalnumber" />
        </div>
    </div>
    <div *ngIf="person">
        <div class="row">
            <div class="col-lg-5">
                <label>Naam</label>
            </div>
            <div class="col-lg-7">{{person.familyName}}</div>
        </div>
        <div class="row">
            <div class="col-lg-5">
                <label>Voornaam</label>
            </div>
            <div class="col-lg-7">{{person.givenName}}</div>
        </div>
        <div class="row">
            <div class="col-lg-5">
                <label>Geboortedatum</label>
            </div>
            <div class="col-lg-7">{{person.birthDate | stringformat : 'xxxx-xx-xx' }}</div>
        </div>
        <div class="row">
            <div class="col-lg-5">
                <label>Adres</label>
            </div>
            <div class="col-lg-7" *ngIf="person.streetName">
                {{person.streetName}} {{person.houseNumber}} {{person.houseNumberExtension}}, {{person.postalCode}} {{person.municipalityName}}
            </div>
        </div>
        <div class="row" *ngIf="person.isMinor">
            <div class="col-lg-5">
                <label>Aanvraag minderjarige</label>
            </div>
            <div class="col-lg-7">
                <span>{{person.isMinor ? "Ja" : "Nee" }}</span>
            </div>
        </div>
    </div>
</div>

【问题讨论】:

    标签: angular


    【解决方案1】:

    这很奇怪,因为解决方案很简单。我在同一个地方有这个错误。我读了一篇有趣的article about the error。 但我以其他方式解决了这个问题。
    来自

    <div class="row">
        <div class="col-lg-12 col-xs-12">
            <button type="submit" class="btn btn-primary" [disabled]="!deliveryRequestForm.valid">Bewaren</button>
        </div>
    </div>
    

    收件人

    <div class="row">
        <div class="col-lg-12 col-xs-12">
            <button type="submit" class="btn btn-primary" [attr.disabled]="!deliveryRequestForm.valid">Bewaren</button>
        </div>
    </div>
    

    【讨论】:

      【解决方案2】:

      如果在更改检测期间更改了绑定值,则会引发此异常。

      我认为这是由deliveryrequest 引起的。

      例如,在随后调用时返回不同值的 getter。

      get deliveryrequest() {
        return randomNumber = Math.random() >= 0.5;
      }
      

      一种解决方法(不适用于上述示例)但通常是避免异常的一种简单方法是显式调用更改检测:

      constructor(private changeDetectorRef:ChangeDetectorRef){}
      
      ngOnChanges()  {
        this.deliveryrequest = randomNumber = Math.random() >= 0.5;
        this.changeDetectorRef.detectChanges();
      }
      

      很难判断这是否适合您,因为您的问题没有提供足够的信息。

      最好的方法是避免这个异常,但这并不总是可行的。

      这个异常也只在开发模式下抛出。
      另见What is difference between production and development mode in Angular2?

      【讨论】:

      • 感谢您的回复。当由于 api 调用而在 oninit 上获取值时,deliveryrequest 的值如何更改?
      • 我做了几个假设,因为我不知道您的应用程序中实际发生了什么。错误消息没有明确说明 deliveryrequest 导致的是。它只是说这是一个从true 更改为false 的字段。我只是希望我提供的信息可以帮助您进一步调查。如果您在问题中添加更多代码会有所帮助。
      • 好的。当我删除 drr-requester 组件时。错误消失了,所以我认为它会在那里的某个地方被触发。我更新了帖子。
      • 这可能是由[ngClass]="{ 'has-error': personForm.controls.nationalnumber.invalid, 之一引起的,尝试将它们更改为[ngClass]="{ 'has-error': personForm.get('nationalnumber').invalid,。这是一个常见的原因,但我不记得最好的避免方法是什么。
      • 对不起,回答晚了,但这也不能解决问题
      【解决方案3】:

      尝试从角核心添加 ChangeDetectionStrategy 并添加到组件中。

      import {  Component, ChangeDetectionStrategy } from '@angular/core';
      @Component({
        changeDetection: ChangeDetectionStrategy.OnPush,
        selector: 'page1',
        templateUrl: 'page1.html',
      })
      

      【讨论】:

        猜你喜欢
        • 2016-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        • 2017-08-28
        • 2018-12-19
        • 2021-09-15
        • 2017-07-08
        相关资源
        最近更新 更多