Skip to content

Commit

Permalink
fix(expansion-panel): toggle not being updated when set programmatically
Browse files Browse the repository at this point in the history
Fixes the toggle arrow not being flipped when the `expanded` is set programmatically, in addition to the `hideToggle` input not working either. This is a regression from angular#5549 and is a consequence of the fact that the panel header reaches into the panel to determine what to do with the arrow.

Fixes angular#5623.
  • Loading branch information
crisbeto committed Jul 26, 2017
1 parent 3cb3945 commit ff4ea0a
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 4 deletions.
4 changes: 3 additions & 1 deletion src/lib/expansion/accordion-item.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,10 @@ export class AccordionItem implements OnDestroy {
@Output() destroyed = new EventEmitter<void>();
/** The unique MdAccordionChild id. */
readonly id = `cdk-accordion-child-${nextId++}`;

/** Whether the MdAccordionChild is expanded. */
@Input() get expanded(): boolean { return this._expanded; }
@Input()
get expanded(): boolean { return this._expanded; }
set expanded(expanded: boolean) {
// Only emit events and update the internal value if the value changes.
if (this._expanded !== expanded) {
Expand Down
30 changes: 28 additions & 2 deletions src/lib/expansion/expansion-panel-header.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import {
Host,
ViewEncapsulation,
ChangeDetectionStrategy,
ChangeDetectorRef,
OnDestroy,
} from '@angular/core';
import {
trigger,
Expand All @@ -22,6 +24,9 @@ import {
} from '@angular/animations';
import {SPACE, ENTER} from '../core/keyboard/keycodes';
import {MdExpansionPanel, EXPANSION_PANEL_ANIMATION_TIMING} from './expansion-panel';
import {filter} from '../core/rxjs/index';
import {merge} from 'rxjs/observable/merge';
import {Subscription} from 'rxjs/Subscription';


/**
Expand Down Expand Up @@ -62,8 +67,22 @@ import {MdExpansionPanel, EXPANSION_PANEL_ANIMATION_TIMING} from './expansion-pa
]),
],
})
export class MdExpansionPanelHeader {
constructor(@Host() public panel: MdExpansionPanel) {}
export class MdExpansionPanelHeader implements OnDestroy {
private _parentChangeSubscription: Subscription | null = null;

constructor(
@Host() public panel: MdExpansionPanel,
private _changeDetectorRef: ChangeDetectorRef) {

// Since the toggle state depends on an @Input on the panel, we
// need to subscribe and trigger change detection manually.
this._parentChangeSubscription = merge(
panel.opened,
panel.closed,
filter.call(panel._inputChanges, changes => !!changes.hideToggle)
)
.subscribe(() => this._changeDetectorRef.markForCheck());
}

/** Toggles the expanded state of the panel. */
_toggle(): void {
Expand Down Expand Up @@ -103,6 +122,13 @@ export class MdExpansionPanelHeader {
return;
}
}

ngOnDestroy() {
if (this._parentChangeSubscription) {
this._parentChangeSubscription.unsubscribe();
this._parentChangeSubscription = null;
}
}
}

/**
Expand Down
17 changes: 16 additions & 1 deletion src/lib/expansion/expansion-panel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ import {
forwardRef,
ChangeDetectionStrategy,
ChangeDetectorRef,
SimpleChanges,
OnChanges,
OnDestroy,
} from '@angular/core';
import {
trigger,
Expand All @@ -27,6 +30,7 @@ import {
import {MdAccordion, MdAccordionDisplayMode} from './accordion';
import {AccordionItem} from './accordion-item';
import {UniqueSelectionDispatcher} from '../core';
import {Subject} from 'rxjs/Subject';


/** MdExpansionPanel's states. */
Expand Down Expand Up @@ -73,10 +77,13 @@ export const EXPANSION_PANEL_ANIMATION_TIMING = '225ms cubic-bezier(0.4,0.0,0.2,
]),
],
})
export class MdExpansionPanel extends AccordionItem {
export class MdExpansionPanel extends AccordionItem implements OnChanges, OnDestroy {
/** Whether the toggle indicator should be hidden. */
@Input() hideToggle: boolean = false;

/** Stream that emits for changes in `@Input` properties. */
_inputChanges = new Subject<SimpleChanges>();

constructor(@Optional() @Host() accordion: MdAccordion,
_changeDetectorRef: ChangeDetectorRef,
_uniqueSelectionDispatcher: UniqueSelectionDispatcher) {
Expand Down Expand Up @@ -107,6 +114,14 @@ export class MdExpansionPanel extends AccordionItem {
_getExpandedState(): MdExpansionPanelState {
return this.expanded ? 'expanded' : 'collapsed';
}

ngOnChanges(changes: SimpleChanges) {
this._inputChanges.next(changes);
}

ngOnDestroy() {
this._inputChanges.complete();
}
}

@Directive({
Expand Down

0 comments on commit ff4ea0a

Please sign in to comment.