Skip to content

Commit 74cf022

Browse files
author
Nedyalko Nikolov
committed
Merge pull request NativeScript#204 from NativeScript/nnikolov/TabViewSelectedIndex
TabView selectedIndex to work with binding.
2 parents a2a8d6e + e6d93ea commit 74cf022

File tree

4 files changed

+37
-6
lines changed

4 files changed

+37
-6
lines changed

src/nativescript-angular/directives/list-view-comp.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {
66
ContentChild,
77
AppViewManager,
88
EmbeddedViewRef,
9-
ViewContainerRef,
109
HostListener,
1110
IterableDiffers,
1211
IterableDiffer,

src/nativescript-angular/directives/tab-view.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,34 @@
11
import {ElementRef, Directive, Input, TemplateRef, ViewContainerRef} from "angular2/core";
22
import {TabView, TabViewItem} from "ui/tab-view";
3-
import {isView} from "../view-util";
43

54
@Directive({
6-
selector: 'TabView'
5+
selector: 'TabView',
6+
inputs: ['selectedIndex']
77
})
88
export class TabViewDirective {
99
public tabView: TabView;
10+
private _selectedIndex: number;
11+
private viewInitialized: boolean;
12+
13+
get selectedIndex(): number {
14+
return this._selectedIndex;
15+
}
16+
17+
set selectedIndex(value: number) {
18+
this._selectedIndex = value;
19+
if (this.viewInitialized) {
20+
this.tabView.selectedIndex = this._selectedIndex;
21+
}
22+
}
1023

1124
constructor(private element: ElementRef) {
1225
this.tabView = element.nativeElement;
1326
}
27+
28+
ngAfterViewInit() {
29+
this.viewInitialized = true;
30+
this.tabView.selectedIndex = this._selectedIndex;
31+
}
1432
}
1533

1634
@Directive({

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export type SelectableView = {selectedIndex: number} & View;
1818
* ```
1919
*/
2020
@Directive({
21-
selector: 'SegmentedBar[ngModel], ListPicker[ngModel]',
21+
selector: 'SegmentedBar[ngModel], ListPicker[ngModel], TabView[ngModel]',
2222
host: { '(selectedIndexChange)': 'onChange($event.value)' },
2323
bindings: [SELECTED_INDEX_VALUE_ACCESSOR]
2424
})
@@ -28,6 +28,9 @@ export class SelectedIndexValueAccessor extends BaseValueAccessor<SelectableView
2828
constructor(elementRef: ElementRef) {
2929
super(elementRef.nativeElement);
3030
}
31+
32+
private _normalizedValue: number;
33+
private viewInitialized: boolean;
3134

3235
writeValue(value: any): void {
3336
let normalizedValue;
@@ -41,7 +44,15 @@ export class SelectedIndexValueAccessor extends BaseValueAccessor<SelectableView
4144
normalizedValue = isNaN(parsedValue) ? 0 : parsedValue;
4245
}
4346
}
44-
this.view.selectedIndex = Math.round(normalizedValue);
47+
this._normalizedValue = Math.round(normalizedValue);
48+
if (this.viewInitialized) {
49+
this.view.selectedIndex = this._normalizedValue;
50+
}
51+
}
52+
53+
ngAfterViewInit() {
54+
this.viewInitialized = true;
55+
this.view.selectedIndex = this._normalizedValue;
4556
}
4657

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

tests/app/tests/value-accessor-tests.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,17 @@ describe("two-way binding via ng-model", () => {
9898

9999
it("converts strings to int selection", () => {
100100
const accessor = new TestSelectedIndexValueAccessor()
101-
101+
102102
accessor.writeValue(null);
103+
accessor.ngAfterViewInit();
103104
assert.strictEqual(0, accessor.view.selectedIndex, "default to 0 on empty")
104105

105106
accessor.writeValue("3");
107+
accessor.ngAfterViewInit();
106108
assert.strictEqual(3, accessor.view.selectedIndex)
107109

108110
accessor.writeValue("blah");
111+
accessor.ngAfterViewInit();
109112
assert.strictEqual(0, accessor.view.selectedIndex, "default to 0 on parse errors")
110113
});
111114

0 commit comments

Comments
 (0)