ошибка консоли angular 2 Невозможно привязать к ngIf, так как это неизвестное свойство span

Пожалуйста, не отмечайте это "дубликат...". Я прочитал другие сообщения SO, описывающие эту ошибку. Я пробовал эти решения.

Если вы посмотрите на мой код ниже, вы увидите, что у меня есть BrowserModule, импортированный в app.module.ts, и у меня есть CommonModule, импортированный в мой login-modal.component.ts, но эта ошибка сохраняется для меня. В моем коде есть другая ошибка, которая не позволяет этим SO-решениям работать на меня.

Ошибка консоли находится внизу.

Большое спасибо за то, что поделились своим опытом. Я застрял :-/

// ----------------------------------------------------------------------------
// src/app/app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { AngularFireModule } from 'angularfire2';
import { firebaseConfig } from './../environments/firebase.config';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { HomeModule } from './home/home.module';

import { AuthGuard } from './auth.service';
import { routes } from './app.routes';

import { AppComponent } from './app.component';
import { GameComponent } from './game/game.component';
import { HomeComponent } from './home/home.component';
import { LoginComponent } from './login/login.component';
import { EmailComponent } from './email/email.component';
import { SignupComponent } from './signup/signup.component';
import { MembersComponent } from './members/members.component';


@NgModule({
     declarations: [
          AppComponent,
          LoginComponent,
          EmailComponent,
          SignupComponent,
          GameComponent,
          MembersComponent,
     ],
     imports: [
          BrowserModule,
          FormsModule,
          HttpModule,
          AngularFireModule.initializeApp(firebaseConfig),
          HomeModule,
          NgbModule.forRoot(),
          routes
     ],
     providers: [AuthGuard],
     bootstrap: [AppComponent]
})
export class AppModule { }


// ----------------------------------------------------------------------------
// src/app/login-model.component.ts

import { NgModule, Component, Input, OnInit, HostBinding } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AngularFire, AuthProviders, AuthMethods } from 'angularfire2';
import { Router } from '@angular/router';
import { moveIn } from '../router.animations';
import { NgbModal, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';

@Component({
    selector: 'app-login-modal',
    template: `
    <div class="modal-header">
        <h4 class="modal-title">Please login...</h4>
        <button type="button" class="close" aria-label="Close" (click)="activeModal.dismiss('Cross click')">
            <span aria-hidden="true">&times;</span>
        </button>
    </div>
    <div class="modal-body">
        <div class="form-container">
        <img src="assets/images/lock.svg" id="lock">

        <span class="error" *ngIf="error">{{ error }}</span>

        <button class="social-btn" (click)="loginFb()" id="fb">Login with Facebook</button><br>
        <button class="social-btn" (click)="loginGoogle()" id="google">Login with Google</button>
        <button class="social-btn" routerLink="/login-email" id="email">Email</button>

        <a routerLink="/signup" routerLinkActive="active" class="alc">No account? <strong>Create one here</strong></a>

        </div>
    </div>
        <div class="modal-footer">
        <button type="button" class="btn btn-secondary" (click)="activeModal.close('Close click')">Close</button>
    </div>
    `
})
export class LoginModalComponent {
    @Input() name;
    public error: any;

    constructor(public activeModal: NgbActiveModal, private modalService: NgbModal,
        public af: AngularFire, private router: Router) {
        // this.af.auth.subscribe(auth => {
        //     if (auth) {
        //         this.router.navigateByUrl('/members');
        //     }
        // });
    }

    public open() {
        const modalRef = this.modalService.open(this);
        modalRef.componentInstance.name = 'World';
    }

    loginFb() {
        this.af.auth.login({
            provider: AuthProviders.Facebook,
            method: AuthMethods.Popup,
        }).then(
            (success) => {
                this.router.navigate(['/home']);
            }).catch(
            (err) => {
                this.error = err;
            })
    }

    loginGoogle() {
        this.af.auth.login({
            provider: AuthProviders.Google,
            method: AuthMethods.Popup,
        }).then(
            (success) => {
                this.router.navigate(['/home']);
            }).catch(
            (err) => {
                this.error = err;
            });
    }
}

@NgModule({
    declarations: [LoginModalComponent],
    imports: [
        CommonModule,
        NgbModal,
        NgbActiveModal,
        AngularFire
    ]
})
export class LoginModalModule {
}

введите здесь описание изображения

EDIT: достигнут небольшой прогресс

Хорошо, со всеми вашими советами, я добился некоторого прогресса. Страница загружается без ошибок, но теперь ошибка @NgModule.entryComponent. Я думал, что знаю, как это исправить, но добавление в entryComponents не работает.

Вот новый код...

// ----------------------------------------------------------------------------
// src/app/home/home.component.ts

import { Component, OnInit } from '@angular/core';
import { LoginModalComponent } from './../modal/login-modal.component';

@Component({
    selector: 'app-home',
    templateUrl: './home.component.html',
    styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
    constructor(public loginModal: LoginModalComponent) { }

    public showLoginModal() {
        console.log('Inside home.component.showLoginModal()');
        this.loginModal.open();
    }

    ngOnInit() {
    }
}


// ----------------------------------------------------------------------------
// src/app/home/home.module.ts

import { NgModule } from '@angular/core';
import { NgbModalModule, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
import { LoginModalModule, LoginModalComponent } from './../modal/login-modal.component';
import { HomeComponent } from './home.component';

@NgModule({
    imports: [LoginModalModule],
    declarations: [HomeComponent],
    providers: [NgbActiveModal, LoginModalComponent]
})
export class HomeModule {

}


// ----------------------------------------------------------------------------
// src/app/login-model.component.ts

import { NgModule, Component, Input, OnInit, HostBinding } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AngularFire, AuthProviders, AuthMethods } from 'angularfire2';
import { Router } from '@angular/router';
import { moveIn } from '../router.animations';
import { NgbModal, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';

@Component({
    selector: 'ngb-login-modal',
    template: `
    <div class="modal-header">
        <h4 class="modal-title">Please login...</h4>
        <button type="button" class="close" aria-label="Close" (click)="activeModal.dismiss('Cross click')">
            <span aria-hidden="true">&times;</span>
        </button>
    </div>
    <div class="modal-body">
        <div class="form-container">
        <img src="assets/images/lock.svg" id="lock">

        <span class="error" *ngIf="error">{{ error }}</span>

        <button class="social-btn" (click)="loginFb()" id="fb">Login with Facebook</button><br>
        <button class="social-btn" (click)="loginGoogle()" id="google">Login with Google</button>
        <button class="social-btn" routerLink="/login-email" id="email">Email</button>

        <a routerLink="/signup" routerLinkActive="active" class="alc">No account? <strong>Create one here</strong></a>

        </div>
    </div>
        <div class="modal-footer">
        <button type="button" class="btn btn-secondary" (click)="activeModal.close('Close click')">Close</button>
    </div>
    `
})
export class LoginModalComponent {
    @Input() name;
    public error: any;

    constructor(public modalService: NgbModal, public activeModal: NgbActiveModal,
        public af: AngularFire, private router: Router) {
        // this.af.auth.subscribe(auth => {
        //     if (auth) {
        //         this.router.navigateByUrl('/members');
        //     }
        // });
    }

    public open() {
        const modalRef = this.modalService.open(this.activeModal);
        modalRef.componentInstance.name = 'World';
    }

    loginFb() {
        this.af.auth.login({
            provider: AuthProviders.Facebook,
            method: AuthMethods.Popup,
        }).then(
            (success) => {
                this.router.navigate(['/home']);
            }).catch(
            (err) => {
                this.error = err;
            })
    }

    loginGoogle() {
        this.af.auth.login({
            provider: AuthProviders.Google,
            method: AuthMethods.Popup,
        }).then(
            (success) => {
                this.router.navigate(['/home']);
            }).catch(
            (err) => {
                this.error = err;
            });
    }
}

@NgModule({
    declarations: [LoginModalComponent],
    imports: [
        CommonModule
    ]
})
export class LoginModalModule {
}

Вот новая ошибка @NgModule.entryComponent в консоли...

введите здесь описание изображения


person Locohost    schedule 20.02.2017    source источник
comment
Какую версию углового вы используете?   -  person Frank Adrian    schedule 20.02.2017
comment
Почему вы создаете модуль для компонента? И куда вы импортируете этот модуль? BrowserModule уже содержит CommonModule, поэтому дополнительный CommonModule не нужен.   -  person bergben    schedule 20.02.2017
comment
Может быть, я что-то упускаю, но вы, кажется, не импортируете LoginModalModule в свой основной модуль приложения.   -  person MikeOne    schedule 20.02.2017


Ответы (2)


В моем случае я пытался загрузить компонент через модальное окно начальной загрузки Angular... но я забыл включить этот компонент в список компонентов моего модуля declarations:[]!

Компонент был отрендерен с помощью bootstrap ng modal, но *ngIf и *ngFor не работали. Как только я добавил компонент в список компонентов модуля, все заработало, как и ожидалось.

person Samer    schedule 05.04.2021

Попробуйте следующее: импортируйте CommonModule в модуль, объявляющий компонент. Убедитесь, что это не только в операторе импорта, но и «импортирует» в API модуля (так что imports : [ ... ] и т. д.).

Затем вы сможете удалить импорт из компонента, и все должно работать.

Раздел imports API модуля предназначен для импорта модулей, чтобы объявленные классы в этом модуле могли использовать возможности этого импортированного модуля.

Так или иначе, в верхней части модуля, в котором объявляются компоненты, сделайте следующее:

import { CommonModule } from (etc).

В API модуля (в котором вы должны были «объявить» свой компонент):

imports: [ CommonModule ]

И удалите его из компонента, который у вас его импортирует (и куда угодно, если только он вам не нужен в другом модуле).

person Tim Consolazio    schedule 20.02.2017
comment
Код в вопросе уже показывает это ;-) (внизу блока кода) - person Günter Zöchbauer; 20.02.2017
comment
Да, но обратите внимание, что он также импортирует его в компонент. Я разъяснил все это, потому что не уверен, что это сломает его (и в этом нет необходимости). - person Tim Consolazio; 20.02.2017
comment
Импортировать CommonModule в app.module.ts снова совершенно бесполезно, если он уже импортирует BrowserModule. - person bergben; 20.02.2017
comment
Я предложил импортировать его в модуль, и импортировать его (как вы видите), и удалить его в другом месте. Это единственное, что я сразу вижу, может сломать его. - person Tim Consolazio; 20.02.2017
comment
Бергбен, ты уверен, что это правда? - person Tim Consolazio; 20.02.2017
comment
BrowserModule импортирует CommonModule и реэкспортирует его. В результате импортер BrowserModule автоматически получает директивы CommonModule. см. angular.io/docs/ts/latest/guide/ngmodule.html Удаление CommonModule может помочь, но добавление его в app.module.ts — это просто дублирующийся импорт. - person bergben; 20.02.2017
comment
Хорошо знать Бергбена. Просто чтобы убедиться, что если вы объявите компонент в другом модуле (не в приложении), понадобится ли вам CommonModule там? - person Tim Consolazio; 20.02.2017
comment
АФАИК да. CommonModule больше подходит для опубликованных модулей, они должны (если не нужны) никогда не импортировать BrowserModule, а скорее CommonModule. Мне любопытно, не могли бы вы попробовать, работает ли он без импорта CommonModule? Например, просто удалите CommonModule во втором модуле, бот только импортирует BrowserModule в app.module.ts (если у вас есть время) - person bergben; 20.02.2017
comment
Спасибо за комментарии :-) Я добавил LoginModalModule в импорт app.module.tx, и это помогло. Я смог заставить домашний экран появиться без ошибки консоли. Тем не менее, я все еще не понимаю, какой код помещается в модуль, а какой — в компонент, и как делиться повторно используемыми вещами. Это совместное использование модуля, у которого есть компонент, или совместное использование обоих? Моя проблема на самом деле не понимание, как разделить отдельный LoginModalComponent с другим родительским компонентом. Я все еще пытаюсь понять это. - person Locohost; 20.02.2017
comment
Сделал некоторый прогресс. Отредактирован/добавлен новый код и другая ошибка для публикации. Я думаю, что это близко к работе :-) - person Locohost; 20.02.2017
comment
Я пытался добавить LoginModalComponent в entryComponents как в NgModule, так и в декораторах компонентов. Ни один из них не исправляет ошибку, поэтому я думаю, что это вводит в заблуждение. - person Locohost; 20.02.2017
comment
Рад быть полезным Locohost. Чертовски запутанно знать, что делает API модуля. Я много раз читал документы и сводил их к следующему: объявления = компоненты, принадлежащие этому модулю (компонент должен принадлежать одному и только одному модулю). Импорт = модули, которые нужны компонентам этого модуля (и он не каскадируется из модуля, который импортирует этот, например, приложение). Экспорт = если вы хотите использовать компоненты этого модуля в шаблонах (через селекторы), и предоставляет = внедряемые сервисы, необходимые компонентам этого модуля (вы не предоставляете компоненты или модули). - person Tim Consolazio; 20.02.2017
comment
Итак, ModuleOne импортирует ModuleTwo. В ModuleTwo есть компоненты, которые хотят использовать компоненты из ModuleOne в шаблонах, поэтому ModuleTwo должен импортировать ModuleOne, а ModuleOne должен экспортировать эти компоненты. Если ModuleTwo нуждается в CommonModule для своих компонентов (тех, которые объявляет ModuleTwo), не имеет значения, импортирует ли его ModuleOne, потому что импорт применяется только к объявленным компонентам данного модуля (без каскадирования). Однако, поскольку ModuleOne экспортирует тот или иной компонент, ModuleTwo не должен импортировать эти компоненты, а только модуль, который их объявляет (ModuleOne). - person Tim Consolazio; 20.02.2017
comment
В любом случае да, это одна из тех вещей, на которые я держу пари, в следующей большой версии Angular они скажут: да, мы могли бы сделать все это яснее, потому что даже в документации говорится, что это может сбивать с толку. Хотя запись об этом определенно помогает. - person Tim Consolazio; 20.02.2017
comment
CommonModule уже существует. Его можно изучить для решения проблемы. --›› stackoverflow.com/a/61717414/9198992 - person İbrahim YANIK; 11.01.2021