Skip to content

Commit 835809d

Browse files
author
VladimirAmiorkov
committed
fix(picker): resovle issue with selectedValue, textField and valueField not working when selectedValue is initialy set
1 parent aa2aaf8 commit 835809d

File tree

2 files changed

+56
-7
lines changed

2 files changed

+56
-7
lines changed

src/picker.common.ts

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,8 @@ export class PickerField extends TextField implements TemplatedItemsView {
159159
if (selectedIndex !== undefined) {
160160
let object = this.getDataItem(selectedIndex);
161161
this.selectedIndex = selectedIndex;
162-
let value = this.getValueFromField("selectedValue", this.valueField, object);
163-
this.selectedValue = value === undefined ? object : value;
164162

165-
this.updatePickerText(object);
163+
this._updateSelectedValue(object);
166164
}
167165

168166
this.disposeModalView();
@@ -413,6 +411,11 @@ export class PickerField extends TextField implements TemplatedItemsView {
413411
}
414412
}
415413

414+
private _updateSelectedValue(object: any) {
415+
let value = this.getValueFromField("selectedValue", this.valueField, object);
416+
this.selectedValue = value === undefined ? object : value;
417+
}
418+
416419
private updatePickerText(object: any) {
417420
let textValue = this.getValueFromField("text", this.textField, object);
418421
textValue = textValue === undefined ? object : textValue;
@@ -422,7 +425,55 @@ export class PickerField extends TextField implements TemplatedItemsView {
422425
protected onModalAnimatedChanged(oldValue: boolean, newValue: boolean) { }
423426

424427
protected onSelectedValueChanged(oldValue: any, newValue: any) {
425-
this.text = newValue;
428+
if (this.hasItem(newValue)) {
429+
this.updatePickerText(newValue);
430+
return;
431+
}
432+
433+
let dataItem = this.getObjectFromValue(this.valueField, newValue);
434+
if (dataItem) {
435+
this.updatePickerText(dataItem);
436+
} else {
437+
this.text = newValue;
438+
}
439+
}
440+
441+
private getObjectFromValue(propertyName: string, value: any) {
442+
if (!propertyName) {
443+
return undefined;
444+
}
445+
446+
if (this.items) {
447+
for (let i = 0; i < this.items.length; i++) {
448+
let item = this._getDataItem(i);
449+
if (item.hasOwnProperty(propertyName)) {
450+
let dataItemValue = item[propertyName];
451+
if (dataItemValue === value) {
452+
return item;
453+
}
454+
}
455+
}
456+
}
457+
458+
return undefined;
459+
}
460+
461+
private hasItem(object: any) {
462+
if (this.items) {
463+
for (let i = 0; i < this.items.length; i++) {
464+
let item = this._getDataItem(i);
465+
if (item === object) {
466+
return true;
467+
}
468+
}
469+
}
470+
471+
return false;
472+
}
473+
474+
private _getDataItem(index: number): any {
475+
let thisItems = <ItemsSource>this.items;
476+
return thisItems.getItem ? thisItems.getItem(index) : thisItems[index];
426477
}
427478

428479
protected onValueFieldChanged(oldValue: string, newValue: string) { }

src/picker.d.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export class PickerField extends TextField implements TemplatedItemsView {
5555
public valueField: string;
5656

5757
/**
58-
* Gets the object selected from the list in the modal view.
58+
* Gets or sets the object selected from the list in the modal view.
5959
*/
6060
public selectedValue: any;
6161

@@ -86,8 +86,6 @@ export class PickerField extends TextField implements TemplatedItemsView {
8686

8787
refresh();
8888

89-
_openModalHandler(args): void;
90-
9189
/**
9290
* Identifies the {@link modalAnimated} dependency property.
9391
*/

0 commit comments

Comments
 (0)