fix(autocomplete): error if panel is added asynchronously (#7078)

Fixes an error that was thrown when an autocomplete trigger is initialized without a panel. Note that an error will still be thrown, but only if the user attempts to open the panel.

Fixes #7069.
This commit is contained in:
Kristiyan Kostadinov
2017-09-29 22:13:12 +02:00
committed by Andrew Seguin
parent 8e7726102b
commit 504ba70abd
2 changed files with 14 additions and 2 deletions
+3 -1
View File
@@ -390,7 +390,9 @@ export class MatAutocompleteTrigger implements ControlValueAccessor, OnDestroy {
}
private _setTriggerValue(value: any): void {
const toDisplay = this.autocomplete.displayWith ? this.autocomplete.displayWith(value) : value;
const toDisplay = this.autocomplete && this.autocomplete.displayWith ?
this.autocomplete.displayWith(value) :
value;
// Simply falling back to an empty string if the display value is falsy does not work properly.
// The display value can also be the number zero and shouldn't fall back to an empty string.
+11 -1
View File
@@ -1512,6 +1512,15 @@ describe('MatAutocomplete', () => {
}).toThrow(getMatAutocompleteMissingPanelError());
}));
it('should not throw on init, even if the panel is not defined', fakeAsync(() => {
expect(() => {
const fixture = TestBed.createComponent(AutocompleteWithoutPanel);
fixture.componentInstance.control.setValue('Something');
fixture.detectChanges();
tick();
}).not.toThrow();
}));
it('should hide the placeholder with a preselected form control value ' +
'and a disabled floating placeholder', fakeAsync(() => {
const fixture = TestBed.createComponent(AutocompleteWithFormsAndNonfloatingPlaceholder);
@@ -1885,10 +1894,11 @@ class AutocompleteWithNativeInput {
@Component({
template: `<input placeholder="Choose" [matAutocomplete]="auto">`
template: `<input placeholder="Choose" [matAutocomplete]="auto" [formControl]="control">`
})
class AutocompleteWithoutPanel {
@ViewChild(MatAutocompleteTrigger) trigger: MatAutocompleteTrigger;
control = new FormControl();
}