web-dev-qa-db-fra.com

Exception non détectée dans la promesse lorsque vous essayez d'utiliser des composants imbriqués

J'obtiens cette exception lorsque j'essaie d'utiliser des composants imbriqués:

EXCEPTION: Error: Uncaught (in promise): TypeError: Cannot set property 'endSourceSpan' of null
XCEPTION: Error: Uncaught (in promise): TypeError: Cannot set property 'endSourceSpan' of nullBrowserDomAdapter.logError @ angular2.dev.js:23877BrowserDomAdapter.logGroup @ angular2.dev.js:23888ExceptionHandler.call @ angular2.dev.js:1317(anonymous function) @ angular2.dev.js:12763schedulerFn @ angular2.dev.js:13167SafeSubscriber.__tryOrUnsub @ Rx.js:10775SafeSubscriber.next @ Rx.js:10730Subscriber._next @ Rx.js:10690Subscriber.next @ Rx.js:10667Subject._finalNext @ Rx.js:11191Subject._next @ Rx.js:11183Subject.next @ Rx.js:11142EventEmitter.emit @ angular2.dev.js:13148NgZone._zoneImpl.ng_zone_impl_1.NgZoneImpl.onError @ angular2.dev.js:13566NgZoneImpl.inner.inner.fork.onHandleError @ angular2.dev.js:2128ZoneDelegate.handleError @ angular2-polyfills.js:336Zone.runGuarded @ angular2-polyfills.js:244drainMicroTaskQueue @ angular2-polyfills.js:495ZoneTask.invoke @ angular2-polyfills.js:434
angular2.dev.js:23877 STACKTRACE:BrowserDomAdapter.logError @ angular2.dev.js:23877ExceptionHandler.call @ angular2.dev.js:1319(anonymous function) @ angular2.dev.js:12763schedulerFn @ angular2.dev.js:13167SafeSubscriber.__tryOrUnsub @ Rx.js:10775SafeSubscriber.next @ Rx.js:10730Subscriber._next @ Rx.js:10690Subscriber.next @ Rx.js:10667Subject._finalNext @ Rx.js:11191Subject._next @ Rx.js:11183Subject.next @ Rx.js:11142EventEmitter.emit @ angular2.dev.js:13148NgZone._zoneImpl.ng_zone_impl_1.NgZoneImpl.onError @ angular2.dev.js:13566NgZoneImpl.inner.inner.fork.onHandleError @ angular2.dev.js:2128ZoneDelegate.handleError @ angular2-polyfills.js:336Zone.runGuarded @ angular2-polyfills.js:244drainMicroTaskQueue @ angular2-polyfills.js:495ZoneTask.invoke @ angular2-polyfills.js:434
angular2.dev.js:23877 Error: Uncaught (in promise): TypeError: Cannot set property 'endSourceSpan' of null
    at resolvePromise (angular2-polyfills.js:543)
    at angular2-polyfills.js:520
    at ZoneDelegate.invoke (angular2-polyfills.js:332)
    at Object.NgZoneImpl.inner.inner.fork.onInvoke (angular2.dev.js:2111)
    at ZoneDelegate.invoke (angular2-polyfills.js:331)
    at Zone.run (angular2-polyfills.js:227)
    at angular2-polyfills.js:576
    at ZoneDelegate.invokeTask (angular2-polyfills.js:365)
    at Object.NgZoneImpl.inner.inner.fork.onInvokeTask (angular2.dev.js:2103)
    at ZoneDelegate.invokeTask (angular2-polyfills.js:364)BrowserDomAdapter.logError @ angular2.dev.js:23877ExceptionHandler.call @ angular2.dev.js:1320(anonymous function) @ angular2.dev.js:12763schedulerFn @ angular2.dev.js:13167SafeSubscriber.__tryOrUnsub @ Rx.js:10775SafeSubscriber.next @ Rx.js:10730Subscriber._next @ Rx.js:10690Subscriber.next @ Rx.js:10667Subject._finalNext @ Rx.js:11191Subject._next @ Rx.js:11183Subject.next @ Rx.js:11142EventEmitter.emit @ angular2.dev.js:13148NgZone._zoneImpl.ng_zone_impl_1.NgZoneImpl.onError @ angular2.dev.js:13566NgZoneImpl.inner.inner.fork.onHandleError @ angular2.dev.js:2128ZoneDelegate.handleError @ angular2-polyfills.js:336Zone.runGuarded @ angular2-polyfills.js:244drainMicroTaskQueue @ angular2-polyfills.js:495ZoneTask.invoke @ angular2-polyfills.js:434
angular2-polyfills.js:469 Unhandled Promise rejection: Cannot set property 'endSourceSpan' of null ; Zone: angular ; Task: Promise.then ; Value: TypeError: Cannot set property 'endSourceSpan' of null(…)consoleError @ angular2-polyfills.js:469drainMicroTaskQueue @ angular2-polyfills.js:498ZoneTask.invoke @ angular2-polyfills.js:434
angular2-polyfills.js:471 Error: Uncaught (in promise): TypeError: Cannot set property 'endSourceSpan' of null(…)consoleError @ angular2-polyfills.js:471drainMicroTaskQueue @ angular2-polyfills.js:498ZoneTask.invoke @ angular2-polyfills.js:434

Voici mon code pour le composant principal:

<base-menu [menu-items-list]="menuList" [menu-layer]="layer"
    (select-menu-item)="selectMenuItem($event)"
    (add-new-item)="addMenuItem($event)"></base-menu>
import {BaseMenuComponent} from '../../../../components/menuComponent/baseMenuComponent/baseMenuComponent';

let applicationPath: string = '/app/pages/adminPage/categoriesPage/requestsPage';

@Component({
    selector: 'companies-Page',
    templateUrl: applicationPath + '/requestsPage.html',
    styleUrls:[ applicationPath + '/requestsPage.css'],
    providers:[RequestTypeService, HTTP_PROVIDERS], 
    directives:[BaseMenuComponent]
})
export class RequestsPage implements OnInit {
    requestTypes:Array<RequestType> = new Array();
    searchQuery: string = "";
    menuList = [
        {id:12, layer:0, name:'asd'},
        {id:13, layer:0, name:'asda'},
        {id:14, layer:0, name:'asdd'}];
    layer = 0;
    _requestTypeService:RequestTypeService

    constructor(requestTypeService:RequestTypeService) {
        this._requestTypeService = requestTypeService;
    }

    ngOnInit(){
        //this.getRequestTypesWithFilters();
    }
}

et voici le composant enfant:

import {Component, Input, Output, EventEmitter, OnInit} from 'angular2/core';

@Component({
    selector: 'base-menu',
    //templateUrl: '/app/components/menuComponent/baseMenuComponent/baseMenuComponent.html'
    template:`
    <div class="base-menu-component">
        <ul class="nav nav-pills nav-stacked">
            <li class="form-group row">
                <input class="form-control" [(ngModel)]="newMenuItem"/>
                <button class="btn btn-success" (click)="addMenuItem()">
                    <span class="glyphicon glyphicon-plus"></span>
                </button>
                <button class="btn btn-success" (click)="clearMenuItem()">
                    <span class="glyphicon glyphicon-remove"></span>
                </button>
            </li>
            <li *ngFor="#item of menuItems" [class]="isItemSelected(item) ? 'active':''" (click)="selectItem(item)">
                <a>{{item.name}}</a>
            </li>
        </ul>
    </div>`
})

export class BaseMenuComponent implements OnInit {
    @Input('menu-items-list') menuItemsList:Array<MenuItem>;
    @Input('menu-layer') menuLayer:number;
    @Output('select-menu-item') broadcastMenuItem: EventEmitter<MenuData> = new EventEmitter<MenuData>();
    @Output('add-new-item') broadcastNewItem: EventEmitter<MenuData> = new EventEmitter<MenuData>();

    selectedItem:MenuItem;
    newMenuItem:string;

    constructor() { }

    ngOnInit(){
        this.selectedItem = this.menuItemsList && this.menuItemsList.length > 0 ? this.menuItemsList[0] : null;
        this.newMenuItem = "";
    }

    isItemSelected(menuItem){
        return this.selectedItem == menuItem;
    }

    selectItem(menuItem){
        this.selectedItem = menuItem;
        this.broadcastMenuItem.emit({menuItem:menuItem, menuLayer:this.menuLayer});
    }

    addMenuItem(){
        this.broadcastNewItem.emit({menuItem:this.newMenuItem, menuLayer:this.menuLayer});
        this.clearMenuItem();
    }

    clearMenuItem(){
        this.newMenuItem = "";
    }
}

interface MenuItem{
    id;
    layer;
    parentId;
    name;
}

interface MenuData{
    menuItem;
    menuLayer;
}

Quelqu'un peut-il m'expliquer d'où vient cette erreur et pourquoi elle apparaît?
Pour moi, le HTML et les deux composants semblent très clairs.

22
Nicu

J'ai eu un problème similaire avec une cause différente:

J'ai construit une petite application en utilisant angular-cli et lorsque le html du composant est créé, il a quelque chose comme:

<p>
   Component works !
</p>

Donc ce que j'ai fait, c'est que pour tester un peu mon composant:

<p>
   Component works !

   <div *ngFor="#value in values">
      {{value}}
   </div>
</p>

Mais alors l'erreur est apparue.

C'est juste parce que n paragraphe ne peut pas contenir un élément de bloc comme (div, h1, ul etc.).

Tant de temps perdu juste pour repérer ça ...

Quand je fais

 <div>
    Component works !

    <div *ngFor="#value in values">
       {{value}}
    </div>
 </div>

Ça marche bien;)

29
maxime1992

Peut également signifier que vous manquez un guillemet double de clôture

<div (click)="myClick()>What's up with my CODE!???</div>
14
Justin

J'ai eu un problème similaire. L'erreur que j'ai reçue était "EXCEPTION: TypeError: Impossible de définir la propriété 'endSourceSpan' de null" (voir l'image ci-dessous). Dans mon modèle, j'ai raté la fin ">" pour le div (voir l'image ci-dessous). Une fois que j'ai ajouté le ">", l'erreur a disparu.

Je crois que cette erreur se produit pour tout HTML mal formé dans un modèle Angular 2.

Angular 2 error - Cannot set property 'endSourceSpan' of null

Angular 2 - Missing Ending Bracket on Div

6

J'ai eu le même problème et il s'est avéré qu'il s'agissait d'une balise HTML que je n'avais pas fermée .. très difficile à trouver

4
Spock

<xxx /> est valide si xxx est un élément void

zone, base, br, col, commande, incorporer, hr, img, entrée, keygen, lien, méta, param, source, piste, wbr

https://www.w3.org/TR/html-markup/syntax.html#syntax-elements

Non ça va, j'ai trouvé le bogue une div non fermée en html,

Fermeture manquante <div> c'est.

Probablement

<input class="form-control" [(ngModel)]="newMenuItem"/>

/> n'est pas HTML5 valide. Angular est assez strict sur le HTML que vous passez à Angular.

<input>

Omission de balise Doit avoir une balise de début et ne doit pas avoir de balise de fin.

Changez-le en

<input class="form-control" [(ngModel)]="newMenuItem">
3

j'ai ce problème, car j'enfreins la loi html que je ne connais pas.

c'est un exemple de html interdit: parce que vous avez un élément ul à l'intérieur de l'élément p et qui est interdit dans la loi html

<p>this will not work <ul><li *ngFor="#item on items">{{item.name}}</li></ul></p>

mais cela fonctionnera:

<p>This will definitely work </p>
<ul><li *ngFor="#item on items">{{item.name}}</li></ul>

quand je parle de cela aux angulars, ils m'ont dit que je devais avoir du mal

https://github.com/angular/angular.js/issues/15139#issuecomment-247256778

bien sûr, vous l'aurez dans angularjs1 et angularjs2.

0
albaiti

J'ai eu le même problème et il s'est avéré qu'il me manquait un opérateur d'affectation dans une balise HTML (c'est-à-dire <div class"cf"> au lieu de <div class="cf">)

0
Luke Schoen