最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Uncaught Error: Template parse errors: Angular 4 - Stack Overflow

programmeradmin2浏览0评论

I have been trying to make a simple app in Angular, I was able to make it work in Plunker. Unfortunately, it gives me this error

Can't bind to 'joke' since it isn't a known property of 'app-root'.

that I don't know how to handle.

What is the problem?

jokeponent.ts

import { Component, EventEmitter, Input, Output, OnInit } from '@angular/core';
import { Joke } from '../jokes'

@Component({
  selector: 'app-joke',
  templateUrl: './jokeponent.html',
  styleUrls: ['./jokeponent.css']
})
export class JokeComponent implements OnInit {

  constructor() {}

  @Input("joke") joke: Joke;
  @Output() jokeDeleted = new EventEmitter<Joke>();

  deleteItem() {
    this.jokeDeleted.emit(this.joke)
  }

  ngOnInit() {}
}

joke-formponent.spec

import { async, ComponentFixture, TestBed } from '@angular/core/testing';

import { JokeFormComponent } from './joke-formponent';

describe('JokeFormComponent', () => {
  let ponent: JokeFormComponent;
  let fixture: ComponentFixture<JokeFormComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ JokeFormComponent ]
    })
    pileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(JokeFormComponent);
    ponent = fixtureponentInstance;
    fixture.detectChanges();
  });

  it('should be created', () => {
    expect(ponent).toBeTruthy();
  });
});

joke-listponent

import { Component, OnInit } from '@angular/core';
import {Joke} from '../jokes';

@Component({
  selector: 'app-joke-list',
  templateUrl: './joke-listponent.html',
  styleUrls: ['./joke-listponent.css']
})
export class JokeListComponent implements OnInit{
  jokes: Joke[];

  constructor() {
    this.jokes = [
      new Joke("I am telling a joke.", "Haha, that's funny!"),
      new Joke("I am telling an even funnier joke.", "Hahahahaha!!"),
      new Joke("I am telling the funniest joke.", "HAHAHAHAHAHA!!!!")
    ]
  }
  addJoke(joke) {
    this.jokes.unshift(joke);
  }
  deleteJoke(joke) {
    let indexToDelete = this.jokes.indexOf(joke)
    if (indexToDelete !== -1) {
      this.jokes.splice(indexToDelete, 1);
    }
  }

  ngOnInit() {}
}

appponent

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './appponent.html',
  styleUrls: ['./appponent.css']
})
export class AppComponent {}

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';

import { AppComponent } from './appponent';
import { JokeFormComponent } from './joke-form/joke-formponent';
import { JokeListComponent } from './joke-list/joke-listponent';
import { JokeComponent } from './joke/jokeponent';

@NgModule({
  declarations: [
    AppComponent,
    JokeFormComponent,
    JokeListComponent,
    JokeComponent,
  ],
  imports: [
    BrowserModule,
    FormsModule,
    ReactiveFormsModule,
    HttpModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

I have been trying to make a simple app in Angular, I was able to make it work in Plunker. Unfortunately, it gives me this error

Can't bind to 'joke' since it isn't a known property of 'app-root'.

that I don't know how to handle.

What is the problem?

joke.ponent.ts

import { Component, EventEmitter, Input, Output, OnInit } from '@angular/core';
import { Joke } from '../jokes'

@Component({
  selector: 'app-joke',
  templateUrl: './joke.ponent.html',
  styleUrls: ['./joke.ponent.css']
})
export class JokeComponent implements OnInit {

  constructor() {}

  @Input("joke") joke: Joke;
  @Output() jokeDeleted = new EventEmitter<Joke>();

  deleteItem() {
    this.jokeDeleted.emit(this.joke)
  }

  ngOnInit() {}
}

joke-form.ponent.spec

import { async, ComponentFixture, TestBed } from '@angular/core/testing';

import { JokeFormComponent } from './joke-form.ponent';

describe('JokeFormComponent', () => {
  let ponent: JokeFormComponent;
  let fixture: ComponentFixture<JokeFormComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ JokeFormComponent ]
    })
    .pileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(JokeFormComponent);
    ponent = fixture.ponentInstance;
    fixture.detectChanges();
  });

  it('should be created', () => {
    expect(ponent).toBeTruthy();
  });
});

joke-list.ponent

import { Component, OnInit } from '@angular/core';
import {Joke} from '../jokes';

@Component({
  selector: 'app-joke-list',
  templateUrl: './joke-list.ponent.html',
  styleUrls: ['./joke-list.ponent.css']
})
export class JokeListComponent implements OnInit{
  jokes: Joke[];

  constructor() {
    this.jokes = [
      new Joke("I am telling a joke.", "Haha, that's funny!"),
      new Joke("I am telling an even funnier joke.", "Hahahahaha!!"),
      new Joke("I am telling the funniest joke.", "HAHAHAHAHAHA!!!!")
    ]
  }
  addJoke(joke) {
    this.jokes.unshift(joke);
  }
  deleteJoke(joke) {
    let indexToDelete = this.jokes.indexOf(joke)
    if (indexToDelete !== -1) {
      this.jokes.splice(indexToDelete, 1);
    }
  }

  ngOnInit() {}
}

app.ponent

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.ponent.html',
  styleUrls: ['./app.ponent.css']
})
export class AppComponent {}

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';

import { AppComponent } from './app.ponent';
import { JokeFormComponent } from './joke-form/joke-form.ponent';
import { JokeListComponent } from './joke-list/joke-list.ponent';
import { JokeComponent } from './joke/joke.ponent';

@NgModule({
  declarations: [
    AppComponent,
    JokeFormComponent,
    JokeListComponent,
    JokeComponent,
  ],
  imports: [
    BrowserModule,
    FormsModule,
    ReactiveFormsModule,
    HttpModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
Share Improve this question edited Jul 20, 2017 at 15:45 UnKn0wn27 asked Jul 20, 2017 at 15:29 UnKn0wn27UnKn0wn27 451 gold badge1 silver badge6 bronze badges 5
  • the demo in plunker is working fine.Please mentions the steps to replicate the issue – brk Commented Jul 20, 2017 at 15:30
  • Where is your Joke class in */jokes.ts? can you check path of it. – Avnesh Shakya Commented Jul 20, 2017 at 15:32
  • The path for joke.ts is staying in the app folder. The steps I took is just to include every ponent in its own folder and the HTML script in its own ponent.html. That is everything I did. – UnKn0wn27 Commented Jul 20, 2017 at 15:39
  • If it is in your app folder then you need to check path, I think. something like: ../app/jokes. – Avnesh Shakya Commented Jul 20, 2017 at 15:42
  • I posted the app.module. – UnKn0wn27 Commented Jul 20, 2017 at 15:46
Add a ment  | 

2 Answers 2

Reset to default 1

From the code you have posted I see that your AppComponent class is empty :

export class AppComponent {}

Since you haven't posted your html code, I am guessing you are doing something similar to the plunker, where my-app in plunker is equivalent to app-root in your question's code:

<app-root *ngFor="let j of jokes" [joke]="j" (jokeDeleted)="deleteJoke($event)"></app-root>

Once you add @Input("joke") joke: Joke to AppComponent class, it should not throw that error anymore:

export class AppComponent {
  @Input("joke") joke: Joke;
  @Output() jokeDeleted = new EventEmitter<Joke>();

  deleteItem() {
    this.jokeDeleted.emit(this.joke)
  }
}

You can try to delete this OnInit method that angular generates for us in this child joke.ponent.ts class that implements this @Input method for Property binding [property]. And also restart the server.

发布评论

评论列表(0)

  1. 暂无评论