Angular2 - Ошибка: селектор "app-root" не соответствует ни одному элементу

Я изучаю Angular 2 без предварительного опыта Angular. Я следовал этому руководству: https://www.barbarianmeetscoding.com/blog/2016/03/25/getting-started-with-angular-2-step-by-step-1-your-first-component/.

И после добавления нового компонента "список приложений-людей" и обновления в index.html, я получаю ниже исключения. Что пошло не так?

    Unhandled Promise rejection: The selector "app-root" did not match any elements ; Zone: <root> ; Task: Promise.then ; Value: Error: The selector "app-root" did not match any elements
    at DefaultDomRenderer2.webpackJsonp.../../../platform-browser/@angular/platform-browser.es5.js.DefaultDomRenderer2.selectRootElement (platform-browser.es5.js:2808)
    at DebugRenderer2.webpackJsonp.../../../core/@angular/core.es5.js.DebugRenderer2.selectRootElement (core.es5.js:13710)
    at createElement (core.es5.js:9259)
    at createViewNodes (core.es5.js:12225)
    at createRootView (core.es5.js:12154)
    at callWithDebugContext (core.es5.js:13535)
    at Object.debugCreateRootView [as createRootView] (core.es5.js:12852)
    at ComponentFactory_.webpackJsonp.../../../core/@angular/core.es5.js.ComponentFactory_.create (core.es5.js:9945)
    at ComponentFactoryBoundToModule.webpackJsonp.../../../core/@angular/core.es5.js.ComponentFactoryBoundToModule.create (core.es5.js:3333)
    at ApplicationRef_.webpackJsonp.../../../core/@angular/core.es5.js.ApplicationRef_.bootstrap (core.es5.js:4822) Error: The selector "app-root" did not match any elements
    at DefaultDomRenderer2.webpackJsonp.../../../platform-browser/@angular/platform-browser.es5.js.DefaultDomRenderer2.selectRootElement (http://localhost:4200/vendor.bundle.js:70399:19)
    at DebugRenderer2.webpackJsonp.../../../core/@angular/core.es5.js.DebugRenderer2.selectRootElement (http://localhost:4200/vendor.bundle.js:57800:49)
    at createElement (http://localhost:4200/vendor.bundle.js:53349:23)
    at createViewNodes (http://localhost:4200/vendor.bundle.js:56315:44)
    at createRootView (http://localhost:4200/vendor.bundle.js:56244:5)
    at callWithDebugContext (http://localhost:4200/vendor.bundle.js:57625:42)
    at Object.debugCreateRootView [as createRootView] (http://localhost:4200/vendor.bundle.js:56942:12)
    at ComponentFactory_.webpackJsonp.../../../core/@angular/core.es5.js.ComponentFactory_.create (http://localhost:4200/vendor.bundle.js:54035:46)
    at ComponentFactoryBoundToModule.webpackJsonp.../../../core/@angular/core.es5.js.ComponentFactoryBoundToModule.create (http://localhost:4200/vendor.bundle.js:47423:29)
    at ApplicationRef_.webpackJsonp.../../../core/@angular/core.es5.js.ApplicationRef_.bootstrap (http://localhost:4200/vendor.bundle.js:48912:57)
api.onUnhandledError @ zone.js:643
handleUnhandledRejection @ zone.js:667
_loop_1 @ zone.js:658
api.microtaskDrainDone @ zone.js:662
drainMicroTaskQueue @ zone.js:592
zone.js:645 Error: Uncaught (in promise): Error: The selector "app-root" did not match any elements
Error: The selector "app-root" did not match any elements
    at DefaultDomRenderer2.webpackJsonp.../../../platform-browser/@angular/platform-browser.es5.js.DefaultDomRenderer2.selectRootElement (platform-browser.es5.js:2808)
    at DebugRenderer2.webpackJsonp.../../../core/@angular/core.es5.js.DebugRenderer2.selectRootElement (core.es5.js:13710)
    at createElement (core.es5.js:9259)
    at createViewNodes (core.es5.js:12225)
    at createRootView (core.es5.js:12154)
    at callWithDebugContext (core.es5.js:13535)
    at Object.debugCreateRootView [as createRootView] (core.es5.js:12852)
    at 

    ComponentFactory_.webpackJsonp.../../../core/@angular/core.es5.js.ComponentFactory_.create (core.es5.js:9945)
        at ComponentFactoryBoundToModule.webpackJsonp.../../../core/@angular/core.es5.js.ComponentFactoryBoundToModule.create (core.es5.js:3333)
        at ApplicationRef_.webpackJsonp.../../../core/@angular/core.es5.js.ApplicationRef_.bootstrap (core.es5.js:4822)
        at DefaultDomRenderer2.webpackJsonp.../../../platform-browser/@angular/platform-browser.es5.js.DefaultDomRenderer2.selectRootElement (platform-browser.es5.js:2808)
        at DebugRenderer2.webpackJsonp.../../../core/@angular/core.es5.js.DebugRenderer2.selectRootElement (core.es5.js:13710)
        at createElement (core.es5.js:9259)
        at createViewNodes (core.es5.js:12225)
        at createRootView (core.es5.js:12154)
        at callWithDebugContext (core.es5.js:13535)
        at Object.debugCreateRootView [as createRootView] (core.es5.js:12852)
        at ComponentFactory_.webpackJsonp.../../../core/@angular/core.es5.js.ComponentFactory_.create (core.es5.js:9945)
        at ComponentFactoryBoundToModule.webpackJsonp.../../../core/@angular/core.es5.js.ComponentFactoryBoundToModule.create (core.es5.js:3333)
        at ApplicationRef_.webpackJsonp.../../../core/@angular/core.es5.js.ApplicationRef_.bootstrap (core.es5.js:4822)
        at resolvePromise (zone.js:770)
        at zone.js:696
        at zone.js:712
        at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:391)
        at Zone.webpackJsonp.../../../../zone.js/dist/zone.js.Zone.run (zone.js:141)
        at zone.js:818
        at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:424)
        at Zone.webpackJsonp.../../../../zone.js/dist/zone.js.Zone.runTask (zone.js:191)
        at drainMicroTaskQueue (zone.js:584)
        at <anonymous>

Весь код в точности соответствует приведенной выше ссылке. Но я все еще добавляю некоторые подробности ниже.

index.html:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Calui</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
  <app-people-list></app-people-list>
</body>
</html>

app.component.spec.ts:

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

import { AppComponent } from './app.component';

describe('AppComponent', () => {
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [
        AppComponent
      ],
    }).compileComponents();
  }));

  it('should create the app', async(() => {
    const fixture = TestBed.createComponent(AppComponent);
    const app = fixture.debugElement.componentInstance;
    expect(app).toBeTruthy();
  }));

  it('should have as title 'app'', async(() => {
    const fixture = TestBed.createComponent(AppComponent);
    const app = fixture.debugElement.componentInstance;
    expect(app.title).toEqual('app');
  }));

  it('should render title in a h1 tag', async(() => {
    const fixture = TestBed.createComponent(AppComponent);
    fixture.detectChanges();
    const compiled = fixture.debugElement.nativeElement;
    expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!!');
  }));
});

app.component.ts:

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = '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 { AppComponent } from './app.component';
import { PeopleListComponent } from './people-list/people-list.component';

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

люди-list.component.spec.ts:

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

import { PeopleListComponent } from './people-list.component';

describe('PeopleListComponent', () => {
  let component: PeopleListComponent;
  let fixture: ComponentFixture<PeopleListComponent>;

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

  beforeEach(() => {
    fixture = TestBed.createComponent(PeopleListComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

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

люди-list.component.ts:

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

@Component({
  selector: 'app-people-list',
  template: '
    <p>
      people-list Works!
    </p>
  ',
  styleUrls: ['./people-list.component.css']
})
export class PeopleListComponent implements OnInit {

  constructor() { }

  ngOnInit() {
  }

}

Ответ 1

Угловое начинается с корневого компонента. Когда вы даете

bootstrap: AppComponent 

в вашем app.modules.ts, угловой поиск первого экземпляра app-root в вашем HTML и заменяет этот тег угловым приложением. Таким образом, ваш selector AppComponent должен соответствовать корневому компоненту в HTML.

Вам нужно добавить другой код компонента в app.component.html, чтобы угловые отображали их. Он следует за tree структурой, где app-root находится наверху.

Ответ 2

Иногда один простой способ - просто создать новый проект (определенно выполнимый, только если вы работаете над базовым проектом) - в некоторых случаях вы могли что-то упустить - таким образом вы можете сэкономить время и сосредоточиться на обучении. Это был мой опыт, потраченный впустую почти на 5 часов, чтобы найти причину, по которой это не сработало, и я смог увидеть результат, просто воссоздав все заново, используя базовые команды запуска и изменения кода снова на новом шаблоне.

Ответ 3

Это также происходит, когда ваш тег javascript не закрыт

Ответ 4

В моем случае я включил угловой контент project2 dist в angular project1 assets dir, и я пытался получить к нему доступ с http://localhost:4200/assets/project2/index.html. Bu Наличие iframe внутри компонента project1.

project1 был создан с помощью ng new project1 --prefix project1
project2 был создан с помощью ng new project2 --prefix project2.

Я получаю сообщение об Error: The selector "project1-root" did not match any elements.

Не элегантный способ работы с двумя угловыми проектами, но я хотел что-то быстрое проверить, и это не сработало. В итоге я включил project2 в качестве отдельного модуля в project1.

Угадай, слушать старших (поцелуй) это хорошо =)

Ответ 5

в моем случае index.html был пуст, но у меня были другие файлы, такие как brand-1.index.html и brand-2.index.html и т.д. В angular.json произошла file-replacement на index.html. Это означало, что мне нужно было включить --configuration=brand-1 или build:ssr:brand-1 где build:ssr:brand-1 нибудь в конвейере сборки.