fix(select): stores string | string[]

fixes #11337
This commit is contained in:
Manuel Mtz-Almeida
2017-04-25 22:55:13 +02:00
parent 3b32b8e648
commit ba44780df0
3 changed files with 18 additions and 18 deletions

View File

@ -147,12 +147,13 @@ import { SelectPopover, SelectPopoverOption } from './select-popover-component';
providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: Select, multi: true } ], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: Select, multi: true } ],
encapsulation: ViewEncapsulation.None, encapsulation: ViewEncapsulation.None,
}) })
export class Select extends BaseInput<string[]> implements AfterViewInit, OnDestroy { export class Select extends BaseInput<string[]|string> implements AfterViewInit, OnDestroy {
_multi: boolean = false; _multi: boolean = false;
_options: QueryList<Option>; _options: QueryList<Option>;
_texts: string[] = []; _texts: string[] = [];
_text: string = ''; _text: string = '';
_values: string[] = [];
/** /**
* @input {string} The text to display on the cancel button. Default: `Cancel`. * @input {string} The text to display on the cancel button. Default: `Cancel`.
@ -394,7 +395,7 @@ export class Select extends BaseInput<string[]> implements AfterViewInit, OnDest
set options(val: QueryList<Option>) { set options(val: QueryList<Option>) {
this._options = val; this._options = val;
if (this._value.length === 0) { if (this._values.length === 0) {
// there are no values set at this point // there are no values set at this point
// so check to see who should be selected // so check to see who should be selected
// we use writeValue() because we don't want to update ngModel // we use writeValue() because we don't want to update ngModel
@ -404,14 +405,7 @@ export class Select extends BaseInput<string[]> implements AfterViewInit, OnDest
} }
} }
_inputNormalize(val: any): string[] { _inputShouldChange(val: string[]|string): boolean {
if (Array.isArray(val)) {
return val;
}
return [val + ''];
}
_inputShouldChange(val: string[]): boolean {
return !deepEqual(this._value, val); return !deepEqual(this._value, val);
} }
@ -420,11 +414,12 @@ export class Select extends BaseInput<string[]> implements AfterViewInit, OnDest
*/ */
_inputUpdated() { _inputUpdated() {
this._texts.length = 0; this._texts.length = 0;
this._values = Array.isArray(this._value) ? this._value : [this._value + ''];
if (this._options) { if (this._options) {
this._options.forEach(option => { this._options.forEach(option => {
// check this option if the option's value is in the values array // check this option if the option's value is in the values array
option.selected = this._value.some(selectValue => { option.selected = this._values.some(selectValue => {
return isCheckedProperty(selectValue, option.value); return isCheckedProperty(selectValue, option.value);
}); });

View File

@ -21,7 +21,7 @@ describe('Select', () => {
corpus: [ corpus: [
[['hola'], ['hola']], [['hola'], ['hola']],
[null, []], [null, []],
['hola', ['hola']], ['hola', 'hola'],
[['hola', 'adios'], ['hola', 'adios']] [['hola', 'adios'], ['hola', 'adios']]
] ]
}); });

View File

@ -238,6 +238,16 @@ export class BaseInput<T> extends Ion implements CommonInput<T> {
return this._isFocus; return this._isFocus;
} }
/**
* @hidden
*/
hasValue(): boolean {
const val = this._value;
return isArray(val)
? val.length > 0
: isPresent(val);
}
/** /**
* @hidden * @hidden
*/ */
@ -260,12 +270,7 @@ export class BaseInput<T> extends Ion implements CommonInput<T> {
if (!this._item) { if (!this._item) {
return; return;
} }
this._item.setElementClass('input-has-value', this.hasValue());
const hasValue = isArray(val)
? val.length > 0
: isPresent(val);
this._item.setElementClass('input-has-value', hasValue);
} }
/** /**