I am currently trying to get a custom component running in Angular 2 written with ES6 / ES7 and passed in using Babel.
When I load the page, I get a component accordion with all the relevant data, but all the panels are closed and clicking does nothing. I model my accordion after this TypeScript Plunker . In addition, the removeDynamic () function from AppComponenttoggles when you click the button, but the view is not updated to show the data change. I’m at a loss, having spent most of yesterday and mess with him today. Any insight would be greatly appreciated!
I have mine AppComponent, defined as such, with the appropriate pattern:
import {Component, View} from 'angular2/core';
import {HTTP_PROVIDERS} from 'angular2/http';
import {Accordion, AccordionGroup} from '../components/accordion/accordion.component';
import {NgFor} from 'angular2/common';
@Component({
selector: 'my-app',
providers: [HTTP_PROVIDERS]
})
@View({
templateUrl: './components/app.html',
directives: [Accordion, AccordionGroup, NgFor]
})
export class AppComponent {
constructor() {
console.log('AppComponent constructor() go');
this.isOpen = false;
this.groups = [
{
heading: 'Dynamic 1',
content: 'I am dynamic!'
},
{
heading: 'Dynamic 2',
content: 'I am dynamic as well'
}
];
}
removeDynamic() {
this.groups.pop();
console.log('removeDynamic() run');
}
};
AppComponent:
<p>
<button type="button" class="btn btn-default" (click)="removeDynamic()">
Remove last dynamic
</button>
</p>
<accordion>
<accordion-group heading="This is the header" is-open="true">
This is the content
</accordion-group>
<accordion-group [heading]="group.heading" *ngFor="#group of groups">
{{group.content}}
</accordion-group>
<accordion-group heading="Another group" [is-open]="isOpen">
More content
</accordion-group>
</accordion>
My Angular - Webpack.
Accordion, Angular 2 ES6/ES7:
import {Inject} from 'angular2/core';
import {Component, View} from 'angular2/core';
import {NgClass} from 'angular2/common';
@Component({
selector: 'accordion, [accordion]',
host: {
'class': 'panel-group'
}
})
@View({
templateUrl: './components/accordion/accordion.html'
})
export class Accordion {
constructor() {
console.log('Accordion constructor() go');
this.groups = [];
}
addGroup(group) {
this.groups.push(group);
}
closeOthers(openGroup) {
this.groups.forEach((group) => {
if(group !== openGroup) {
group.isOpen = false;
}
});
}
removeGroup(group) {
let index = this.groups.indexOf(group);
if(index !== -1) {
this.groups.splice(index, 1);
}
}
}
@Component({
selector: 'accordion-group, [accordion-group]',
inputs: ['heading', 'isOpen'],
providers: []
})
@View({
templateUrl: './components/accordion/accordion-group.html',
directives: [NgClass, Accordion]
})
export class AccordionGroup {
constructor(accordion) {
console.log('AccordionGroup constructor() go');
this._isOpen = false;
this.accordion = accordion;
this.accordion.addGroup(this);
}
toggleOpen(event) {
event.preventDefault();
this.isOpen = !this.isOpen;
this.accordion.closeOthers(this);
}
onDestroy() {
this.accordion.removeGroup(this);
}
}
AccordionGroup.parameters = [[Accordion]];
Accordion:
<ng-content></ng-content>
AccordionGroup:
<div class="panel panel-default" [ngClass]="{'panel-open': isOpen}">
<div class="panel-heading" (click)="toggleOpen($event)">
<h4 class="panel-title">
<a href tabindex="0"><span>{{heading}}</span></a>
</h4>
</div>
<div class="panel-collapse" [hidden]="!isOpen">
<div class="panel-body">
<ng-content></ng-content>
</div>
</div>
</div>
, Angular 2 TypeScript, es6/es7 Webpack | Angular 2
: .
, :

, :

, , TypeScript: (