2017-09-08 5 views
1

Ich versuche, eine Chipkomponente zu meiner Angular Webanwendung hinzuzufügen. Es ist in Typescript-, HTML- und CSS-Dateien geschrieben.Eine Chipkomponente in Angular 4 mit Typoskript hinzufügen

Ich habe seit ein paar Wochen gekämpft, um es richtig zu machen und habe nicht die richtige Lösung gefunden.

Hier ist ein Plunkr mit meinem aktuellen Code: https://plnkr.co/edit/zvEP9BOktwk6nBojsZQT?p=catalogue

UPDATE: ich meinen Code bearbeitet haben zu reflektieren, dass ich einen Eingang lese, die ein String-Array ist, ausgewählt genannt. Ich gebe ein String-Array namens code aus.

Unten ist der Code, mit denen ich arbeite:

import { 
    Component, Input, HostBinding, ElementRef, ViewChild, HostListener, EventEmitter, Output, OnInit, SimpleChanges, 
    OnChanges, QueryList, TemplateRef, ContentChildren, Directive 
} from '@angular/core'; 
import {ControlValueAccessor} from '@angular/forms'; 
import {Subject} from "@reactivex/rxjs/dist/es6/Subject"; 

@Component({ 
    selector: 'chips', 
    templateUrl: './chips.component.html', 
    styleUrls: ['./chips.component.scss'] 

}) 

export class ChipsComponent implements ControlValueAccessor, OnInit{ 

    @Output() code: string[]; 
    @Input() type = 'text'; 
    @Input() duplicates = false; 

    @Input() selected: any[]; 

    chips: ['chip1', 'chip2', 'chip3'] 

    chipItemList: any[]; 

    constructor() { 
    } 

    ngOnInit() { 
    console.log("selected in chips component ngOnInit(): " + this.selected); 
    console.log("code in chips component ngOnInit: " + this.code); 
    } 

    addChip($event){ 
    this.selected.push($event.target.value) 
    $event.target.value = ''; 
    } 



    /*addChip(addSelectedCode) { 
    //this.newChips.next(this.addCode); 
    console.log("addCode in chips component addChip(): " + this.addSelectedCode); 
    if (!this.chip || !this.duplicates && this.selected.indexOf(this.chip) !== -1) return; 
    this.selected.push(this.chip); 
    this.chip = null; 
    this.propagateChange(this.selected); 
    this.selectedCodeOutput = this.addSelectedCode; 
    console.log("selectedCodeOutput in chips component: " + this.selectedCodeOutput); 
    } */ 

    remove(index: number) { 
    //this.addSelectedCode.splice(index, 1); 
    this.propagateChange(this.selected); 
    this.selectedCodeOutput = this.addSelectedCode; 
    } 

    /* 
    Form Control Value Accessor 
    */ 
    writeValue(value: any) { 
    if (value !== undefined) this.selected = value; 
    } 

    propagateChange = (_: any) => { 
    }; 

    registerOnChange(fn: any) { 
    this.propagateChange = fn; 
    } 

    registerOnTouched() { 
    } 


} 

Ich glaube, das Problem ist, dass ich nicht in der Lage bin zu meiner Kind-Komponente aus meinen Eltern Vorlage zu nennen.

Hat jemand einen hilfreichen Ratschlag, um die Chipkomponente zum Hinzufügen von Chips zu bekommen?

Vielen Dank!

+0

wenn selectedCodeOutput ist Ihr @Output(), wie kommt es versuchen Sie es in ngOnInit() Funktion anmelden? Welchen Wert siehst du da? Wenn Sie eine Ausgabe erstellen, um mit der übergeordneten Komponente zu sprechen, werden sie normalerweise als Ereignisemitter des Winkels festgelegt und geben einen bestimmten Typ aus. –

+0

Vielen Dank für Ihre Antwort. Ich versuche, es zu protokollieren, um zu sehen, was es enthält. Es kommt tatsächlich nicht einmal zu ngOnInit in meiner Chip-Komponente. Ich habe versucht, einen EventEmitter zu verwenden, aber es brachte nicht das gewünschte Ergebnis. –

+0

haben Sie Ihre chipsComponent zum Deklarationsarray des App-Moduls hinzugefügt? Wenn Sie @Output() verwenden, bedeutet dies im Wesentlichen, dass das untergeordnete Element den übergeordneten Benutzer über Änderungen benachrichtigt. In der Service-Alert-Komponente rufen Sie das Kind mit seinen Selektor- "Chips" an. Ein Fehler, den Sie hören (addSelectedCode), aber Sie richten ihn nicht auf einen bestimmten Zweck aus. Sie möchten etwas arbeiten, am besten mit einer Funktion, wenn eine Ausgabe vom Kind vorliegt. etw so (addSelectedCode) = "onSelectedCodeAddition ($ event)". Haben Sie die Service-Alert-Komponente im App-Modul deklariert? –

Antwort

0

Ich habe Ihren Plünderer aufgeräumt und jetzt kann ich den ganzen Weg zu ngOnInit() in Chips Komponente ohne jeden Fehler bekommen. Nimm es von hier und lass es uns wissen, wenn du Hilfe beim Aufbau der Logik brauchst. Aber vor allem möchte ich Sie bitten, auf die Dokumente auf @Input() und @Ouput() Dekorateure zu verweisen.

plunker

+0

Ich werde auf die Dokumente auf @Input() und @Output() Dekoratoren noch einmal verweisen. Danke für Ihre Hilfe! Wir arbeiten auch daran, die Logik korrekt einzurichten. –

+0

Ich arbeitete an der Einrichtung der Logik. Ich schaute auch auf @Input() und @Output() Dekoratoren. Ich fand, dass ich @ViewChild verwenden musste, um von der Elternvorlage auf die Kindmethode zuzugreifen. Ich arbeite derzeit an der Codierung der Chip-Komponente. Nochmals vielen Dank für Ihre Hilfe. –

+0

Tatsächlich verwenden Sie @ViewChild, um ein Schablonen-Tag aus der übergeordneten Komponente auszuwählen. Aber wenn Sie über die Kommunikation zwischen Eltern- und Kindkomponente sprechen, dann ist Input und Output der richtige Weg. :) –

Verwandte Themen