Skip to content

Commit 354074d

Browse files
authored
fix(renderer): stop performing value conversions (NativeScript#806)
These conversions are now handled by core modules. The conversions performed in the renderer and value accessors are no longer needed. fixes NativeScript#799
1 parent 28fd77b commit 354074d

14 files changed

+48
-132
lines changed

nativescript-angular/common/utils.ts

Lines changed: 0 additions & 16 deletions
This file was deleted.

nativescript-angular/directives/tab-view.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
import { TabView, TabViewItem } from "tns-core-modules/ui/tab-view";
1111

1212
import { CommentNode } from "../element-types";
13-
import { convertToInt } from "../common/utils";
1413
import { rendererLog } from "../trace";
1514
import { isBlank } from "../lang-facade";
1615

@@ -28,7 +27,7 @@ export class TabViewDirective implements AfterViewInit {
2827
}
2928

3029
set selectedIndex(value) {
31-
this._selectedIndex = convertToInt(value);
30+
this._selectedIndex = value;
3231
if (this.viewInitialized) {
3332
this.tabView.selectedIndex = this._selectedIndex;
3433
}

nativescript-angular/lang-facade.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ export function isBlank(obj: any): boolean {
1111
return obj === undefined || obj === null;
1212
}
1313

14-
export function isNumber(obj: any): boolean {
15-
return typeof obj === 'number';
16-
}
17-
1814
export function isDate(obj: any): obj is Date {
1915
return obj instanceof Date && !isNaN(obj.valueOf());
2016
}

nativescript-angular/value-accessors/checked-value-accessor.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { Directive, ElementRef, forwardRef, HostListener } from "@angular/core";
22
import { NG_VALUE_ACCESSOR } from "@angular/forms";
3-
import { isBlank } from "../lang-facade";
43
import { BaseValueAccessor } from "./base-value-accessor";
54
import { Switch } from "tns-core-modules/ui/switch";
65

@@ -34,15 +33,7 @@ export class CheckedValueAccessor extends BaseValueAccessor<Switch> { // tslint:
3433
}
3534

3635
writeValue(value: any): void {
37-
let normalizedValue = false;
38-
if (!isBlank(value)) {
39-
if (typeof value === "string") {
40-
normalizedValue = value.toLowerCase() === "true" ? true : false;
41-
} else {
42-
normalizedValue = !!value;
43-
}
44-
}
45-
this.view.checked = normalizedValue;
36+
this.view.checked = value;
4637
}
4738

4839
registerOnTouched(fn: () => void): void { this.onTouched = fn; }

nativescript-angular/value-accessors/date-value-accessor.ts

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { Directive, ElementRef, forwardRef, HostListener } from "@angular/core";
22
import { NG_VALUE_ACCESSOR } from "@angular/forms";
3-
import { isBlank, isDate } from "../lang-facade";
43
import { BaseValueAccessor } from "./base-value-accessor";
54
import { DatePicker } from "tns-core-modules/ui/date-picker";
65

@@ -34,19 +33,7 @@ export class DateValueAccessor extends BaseValueAccessor<DatePicker> { // tslint
3433
}
3534

3635
writeValue(value: any): void {
37-
let normalizedValue = isBlank(value) ? new Date() : value;
38-
if (!isDate(normalizedValue)) {
39-
if (typeof normalizedValue === "string") {
40-
normalizedValue = new Date(normalizedValue);
41-
} else if (typeof normalizedValue === "number") {
42-
normalizedValue = new Date(normalizedValue);
43-
}
44-
45-
if (!isDate(normalizedValue)) {
46-
normalizedValue = new Date();
47-
}
48-
}
49-
this.view.date = normalizedValue;
36+
this.view.date = value;
5037
}
5138

5239
registerOnTouched(fn: () => void): void { this.onTouched = fn; }

nativescript-angular/value-accessors/number-value-accessor.ts

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { Directive, ElementRef, forwardRef, HostListener } from "@angular/core";
22
import { NG_VALUE_ACCESSOR } from "@angular/forms";
3-
import { isBlank, isNumber } from "../lang-facade";
43
import { BaseValueAccessor } from "./base-value-accessor";
54
import { Slider } from "tns-core-modules/ui/slider";
65

@@ -34,18 +33,7 @@ export class NumberValueAccessor extends BaseValueAccessor<Slider> { // tslint:d
3433
}
3534

3635
writeValue(value: any): void {
37-
let normalizedValue;
38-
if (isBlank(value)) {
39-
normalizedValue = 0;
40-
} else {
41-
if (isNumber(value)) {
42-
normalizedValue = value;
43-
} else {
44-
let parsedValue = Number(value);
45-
normalizedValue = isNaN(parsedValue) ? 0 : parsedValue;
46-
}
47-
}
48-
this.view.value = normalizedValue;
36+
this.view.value = value;
4937
}
5038

5139
registerOnTouched(fn: () => void): void { this.onTouched = fn; }

nativescript-angular/value-accessors/selectedIndex-value-accessor.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { Directive, ElementRef, forwardRef, AfterViewInit, HostListener } from "
22
import { NG_VALUE_ACCESSOR } from "@angular/forms";
33
import { BaseValueAccessor } from "./base-value-accessor";
44
import { View } from "tns-core-modules/ui/core/view";
5-
import { convertToInt } from "../common/utils";
65

76
const SELECTED_INDEX_VALUE_ACCESSOR = {provide: NG_VALUE_ACCESSOR,
87
useExisting: forwardRef(() => SelectedIndexValueAccessor), multi: true};
@@ -35,19 +34,19 @@ export class SelectedIndexValueAccessor extends BaseValueAccessor<SelectableView
3534
super(elementRef.nativeElement);
3635
}
3736

38-
private _normalizedValue: number;
37+
private value: number;
3938
private viewInitialized: boolean;
4039

4140
writeValue(value: any): void {
42-
this._normalizedValue = convertToInt(value);
41+
this.value = value;
4342
if (this.viewInitialized) {
44-
this.view.selectedIndex = this._normalizedValue;
43+
this.view.selectedIndex = this.value;
4544
}
4645
}
4746

4847
ngAfterViewInit() {
4948
this.viewInitialized = true;
50-
this.view.selectedIndex = this._normalizedValue;
49+
this.view.selectedIndex = this.value;
5150
}
5251

5352
registerOnTouched(fn: () => void): void { this.onTouched = fn; }

nativescript-angular/value-accessors/text-value-accessor.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { Directive, ElementRef, forwardRef, HostListener } from "@angular/core";
22
import { NG_VALUE_ACCESSOR } from "@angular/forms";
3-
import { isBlank } from "../lang-facade";
43
import { BaseValueAccessor } from "./base-value-accessor";
54
import { View } from "tns-core-modules/ui/core/view";
65

@@ -36,8 +35,7 @@ export class TextValueAccessor extends BaseValueAccessor<TextView> { // tslint:d
3635
}
3736

3837
writeValue(value: any): void {
39-
let normalizedValue = isBlank(value) ? "" : value.toString();
40-
this.view.text = normalizedValue;
38+
this.view.text = value;
4139
}
4240

4341
registerOnTouched(fn: () => void): void { this.onTouched = fn; }

nativescript-angular/value-accessors/time-value-accessor.ts

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { Directive, ElementRef, forwardRef, HostListener } from "@angular/core";
22
import { NG_VALUE_ACCESSOR } from "@angular/forms";
3-
import { isBlank, isDate } from "../lang-facade";
43
import { BaseValueAccessor } from "./base-value-accessor";
54
import { TimePicker } from "tns-core-modules/ui/time-picker";
65

@@ -34,18 +33,7 @@ export class TimeValueAccessor extends BaseValueAccessor<TimePicker> { // tslint
3433
}
3534

3635
writeValue(value: any): void {
37-
let normalizedValue = isBlank(value) ? new Date() : value;
38-
if (!isDate(normalizedValue)) {
39-
if (typeof normalizedValue === "string") {
40-
normalizedValue = new Date(normalizedValue);
41-
} else if (typeof normalizedValue === "number") {
42-
normalizedValue = new Date(normalizedValue);
43-
}
44-
if (!isDate(normalizedValue)) {
45-
normalizedValue = new Date();
46-
}
47-
}
48-
this.view.time = normalizedValue;
36+
this.view.time = value;
4937
}
5038

5139
registerOnTouched(fn: () => void): void { this.onTouched = fn; }

nativescript-angular/view-util.ts

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -207,41 +207,32 @@ export class ViewUtil {
207207

208208

209209
private setPropertyInternal(view: NgView, attributeName: string, value: any): void {
210-
traceLog("Setting attribute: " + attributeName);
211-
212-
let propMap = this.getProperties(view);
210+
traceLog(`Setting attribute: ${attributeName}=${value} to ${view}`);
213211

214212
if (attributeName === "class") {
215213
this.setClasses(view, value);
216-
} else if (XML_ATTRIBUTES.indexOf(attributeName) !== -1) {
217-
view._applyXmlAttribute(attributeName, value);
218-
} else if (propMap.has(attributeName)) {
219-
// We have a lower-upper case mapped property.
220-
let propertyName = propMap.get(attributeName);
221-
view[propertyName] = this.convertValue(value);
222-
} else {
223-
// Unknown attribute value -- just set it to our object as is.
224-
view[attributeName] = this.convertValue(value);
214+
return;
225215
}
226-
}
227216

228-
private convertValue(value: any): any {
229-
if (typeof (value) !== "string" || value === "") {
230-
return value;
217+
if (XML_ATTRIBUTES.indexOf(attributeName) !== -1) {
218+
view._applyXmlAttribute(attributeName, value);
219+
return;
231220
}
232221

233-
let valueAsNumber = +value;
234-
if (!isNaN(valueAsNumber)) {
235-
return valueAsNumber;
236-
} else if (value && (value.toLowerCase() === "true" || value.toLowerCase() === "false")) {
237-
return value.toLowerCase() === "true" ? true : false;
238-
} else {
239-
return value;
222+
const propMap = this.getProperties(view);
223+
const propertyName = propMap.get(attributeName);
224+
if (propertyName) {
225+
// We have a lower-upper case mapped property.
226+
view[propertyName] = value;
227+
return;
240228
}
229+
230+
// Unknown attribute value -- just set it to our object as is.
231+
view[attributeName] = value;
241232
}
242233

243234
private getProperties(instance: any): Map<string, string> {
244-
let type = instance && instance.constructor;
235+
const type = instance && instance.constructor;
245236
if (!type) {
246237
return new Map<string, string>();
247238
}
@@ -253,6 +244,7 @@ export class ViewUtil {
253244
}
254245
propertyMaps.set(type, propMap);
255246
}
247+
256248
return propertyMaps.get(type);
257249
}
258250

0 commit comments

Comments
 (0)