首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular4 - ExpressionChangedAfterItHasBeenCheckedError

Angular4 - ExpressionChangedAfterItHasBeenCheckedError
EN

Stack Overflow用户
提问于 2017-12-15 17:48:13
回答 1查看 177关注 0票数 0

我知道有几个关于这个错误的问题的答案。我尝试过其中的几个都没有用,所以我想如果我提供一些特定于上下文的细节,可能会有人对这个问题有专门的洞察力。

我有一个父组件和子组件,它们都需要相互通信。这两个组件都相当健壮,因此我将尽量保持代码示例的简洁性。

用户表单组件-父组件

代码语言:javascript
复制
@Component({
    selector: 'hl2-user-form',
    templateUrl: './user-form.component.html',
    styleUrls: ['./user-form.component.scss']
})
export class UserFormComponent extends BaseComponentService implements OnInit, OnDestroy {
    @Input() model: PanelModel;

    // use to track changes in assigned user companies in grid
    userCompanies: UserCompanyModel[] = [];
    companies: CompanyModel[] = [];
    userForm: FormGroup;
    confirmation: IConfirmationModel;
    statusEnum = StatusEnum;
    systemParameterMessage: string = '';

    rowData: Array<any> = [];

    selectedDepartmentsAssigned: IUserFormDepartmentsAssignedGridViewModel[] = [];
    selectedUserRolesAssigned: IUserRoleAssignedViewModel[] = [];

    gridOptions: GridOptions = <GridOptions>{};
    gridData: BehaviorSubject<any> = new BehaviorSubject(null);
    isEdit: BehaviorSubject<boolean> = new BehaviorSubject(null);

    defaultCompanyOptions: SelectItem[] = [];
    userTypeOptions: SelectItem[] = [];
    defaultApplicationOptions: SelectItem[] = [];
    settingsForOptions: SelectItem[] = [];
    settingsForDropdownSelectedCompanyId: number = null;
    emergencyRoleIdSelected: number = null;
    isChildComponentReadyForLoad: boolean = false;

    constructor(route: ActivatedRoute,
                public userService: UserService,
                public cdRef: ChangeDetectorRef,
                private formBuilder: FormBuilder,
                private helpUrlService: HelpUrlService,
                private adminPanelService: AdminPanelService,
                private panelService: PanelService,
                public adminConfirmationService: AdminConfirmationService,
                private messageTranslatorService: MessageTranslatorService,
                private companyService: CompanyService,
                private gridStateService: GridStateService,
                private applicationService: ApplicationService,
                private systemParameterService: SystemParameterService) {
        super(route);
    }

用户表单组件模板/标记(相关性)--父组件

代码语言:javascript
复制
<!--far much more parent-component (user-form) mark-up above this line-->
            <button pButton class="ui-button-info" label="{{'Lang.Admin.Help' | translate}}"
                    (click)="onHelpClicked()"></button>
            <button pButton label="test button" (click)="test()">TEST BUTTON</button>
        </div>
    </div>
    <hr/>
    <hl2-company-specific-security-settings *ngIf="isEdit.value && isChildComponentReadyForLoad" [companies]="companies" [confirmation]="confirmation"
                                            [defaultCompanyOptions]="defaultCompanyOptions"
                                            [isEdit]="isEdit" [userCompanies]="userCompanies"
                                            [settingsForOptions]="settingsForOptions"
                                            [settingsForDropdownSelectedCompanyId]="settingsForDropdownSelectedCompanyId"
                                            (selectedDepartmentsAssigned)="onDepartmentsSelected($event)"
                                            (selectedUserRolesAssigned)="onUserRolesSelected($event)"
                                            (selectedEmergencyRoleId)="onEmergencyRoleIdSelected($event)">
    </hl2-company-specific-security-settings>

公司特定安全设置组件--子组件

代码语言:javascript
复制
@Component({
    selector: 'hl2-company-specific-security-settings',
    templateUrl: './company-specific-security-settings.component.html',
    styleUrls: ['./company-specific-security-settings.component.scss']
})

export class CompanySpecificSecuritySettingsComponent extends BaseComponentService implements OnInit, OnDestroy,
    OnChanges {
    @Input() userCompanies: UserCompanyModel[] = [];
    @Input() confirmation: ConfirmationModel = null;
    @Input() defaultCompanyOptions: SelectItem[] = [];
    @Input() isEdit: BehaviorSubject<boolean> = new BehaviorSubject(null);
    @Input() companies: CompanyModel[] = [];
    @Input() settingsForOptions: SelectItem[] = [];
    @Input() settingsForDropdownSelectedCompanyId: number = null;

    @Output() selectedDepartmentsAssigned: EventEmitter<IUserFormDepartmentsAssignedGridViewModel[]>
        = new EventEmitter<IUserFormDepartmentsAssignedGridViewModel[]>();
    @Output() selectedUserRolesAssigned: EventEmitter<IUserRoleAssignedViewModel[]>
        = new EventEmitter<IUserRoleAssignedViewModel[]>();
    @Output() selectedEmergencyRoleId: EventEmitter<number> = new EventEmitter<number>();

    emergencyRoleOptions: SelectItem[] = [];
    emergencyRoleIdSelected: number = null;

    departmentAssignedRowData: Array<IUserFormDepartmentsAssignedGridViewModel> = [];
    userRoleAssignedRowData: Array<IUserRoleAssignedViewModel> = [];
    initialDepartmentsAssignedRows: Array<IUserFormDepartmentsAssignedGridViewModel> = [];
    initialUserRolesAssignedRows: Array<IUserRoleAssignedViewModel> = [];

    departmentAssignedGridOptions = <GridOptions>{
        onRowSelected: () => {
            this.emitSelectedDepartments();
        }
    };

    userRoleAssignedGridOptions = <GridOptions>{
        onRowSelected: () => {
            this.emitSelectedRoles();
        }
    };

    constructor(route: ActivatedRoute,
                public userService: UserService,
                public cdRef: ChangeDetectorRef,
                public adminConfirmationService: AdminConfirmationService,
                private roleService: RoleService,
                private departmentService: DepartmentService) {
        super(route);
    }

公司特定的安全设置模板/标记(相关性)-子组件

代码语言:javascript
复制
<div class="flex-component">
    <h4 class="center-header">{{'Lang.Admin.CompanySpecificSettings' | translate}}</h4>
    <h5>{{'Lang.Admin.SecuritySettings' | translate}}</h5>
    <div class="company-specific-dropdowns">
        <label>{{'Lang.Admin.SettingsFor' | translate}}</label>
        <p-dropdown [options]="settingsForOptions" [autoWidth]="false" (onChange)="onSettingsForSelectionChanged()"
                    [(ngModel)]="settingsForDropdownSelectedCompanyId" [ngModelOptions]="{standalone: true}"></p-dropdown>
        <label>{{'Lang.Admin.EmergencyAccessRole' | translate}}</label>
        <p-dropdown [options]="emergencyRoleOptions" [autoWidth]="false" [(ngModel)]="emergencyRoleIdSelected"
                    (onChange)="setEmergencyRoleId()"
                    [ngModelOptions]="{standalone: true}"></p-dropdown>
    </div>

正如您可能看到的,我正在使用@Output()道具与父级通信。当我更改settingsForDropdownSelectedCompanyId**,的下拉选项(但不是所有时间)时,就会发生错误。**

当然乐意提供更多的代码,如果它相关,但我希望它不太密集的阅读,以获得足够的上下文。对于任何有能力帮忙的人。

EN

回答 1

Stack Overflow用户

发布于 2017-12-15 18:25:14

此错误通常会告诉您哪个变量已更改。你能提供那是什么吗?通常它是这样写的:“表达式已经改变了……somevar..previous值:假新值: true。

代码语言:javascript
复制
<hl2-company-specific-security-settings
[hidden]="!isEdit.value || !isChildComponentReadyForLoad"
[companies]="companies" [confirmation]="confirmation"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47837435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档