Skip to content

Commit 3c957f0

Browse files
author
Vladimir Amiorkov
authored
Resolve missing "className" property of Angular component (#29)
* chore: update reactive forms example with conditional styling * fix: add component wide 'className' proeprty that is exposing the `nativeElement` property #27
1 parent 28d5b93 commit 3c957f0

File tree

4 files changed

+49
-21
lines changed

4 files changed

+49
-21
lines changed

demo-angular/src/app/examples/reactive-forms/reactive-forms-example.component.css

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ PickerPage ActionBar {
3939
color: white;
4040
}
4141

42+
.label-bold {
43+
font-weight: bold;
44+
}
45+
4246
.field-name-label {
4347
font-size: 20;
4448
font-weight: bold;
@@ -52,6 +56,12 @@ PickerPage ActionBar {
5256
margin: 20;
5357
}
5458

55-
.green-label {
59+
.invalid-label {
60+
color: red;
61+
font-size: 20;
62+
}
63+
64+
.valid-label {
5665
color: green;
66+
font-size: 20;
5767
}

demo-angular/src/app/examples/reactive-forms/reactive-forms-example.component.html

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@
1414
</ng-template>
1515
</PickerField>
1616

17-
<GridLayout row="1" col="0" colSpan="2" rows="auto, auto, auto" backgroundColor="white">
17+
<StackLayout row="1" col="0" colSpan="2" backgroundColor="white">
1818
<Button class="submit-button" text="Submit form" (tap)="onSubmit()"></Button>
19-
<Label class="centered-label" row="1" text="Picker css classes:"></Label>
20-
<Label class="centered-label green-label" row="2" [text]="pickerClassName"></Label>
21-
</GridLayout>
19+
<Label class="centered-label label-bold" text="Picker.className:"></Label>
20+
<Label class="centered-label" [text]="picker.className"></Label>
21+
<Label class="centered-label label-bold" text="Picker.nativeElement.className:"></Label>
22+
<Label class="centered-label" [text]="picker.nativeElement.className"></Label>
23+
<Label [class]="picker.className.includes('ng-invalid') ? 'centered-label invalid-label' : 'centered-label valid-label'" text="Form status !!!"></Label>
24+
</StackLayout>
2225
</GridLayout>>

demo-angular/src/app/examples/reactive-forms/reactive-forms-example.component.ts

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
1-
import { Component, OnInit, ViewChild } from "@angular/core";
1+
import { Component, AfterViewInit, ViewChild } from "@angular/core";
22
import { FormBuilder, FormGroup, FormControl, Validators } from "@angular/forms";
33
import { RouterExtensions } from "nativescript-angular/router";
44
import { ObservableArray } from "tns-core-modules/data/observable-array/observable-array";
55
import { PickerFieldComponent } from "nativescript-picker/angular";
66
import { EventData } from "tns-core-modules/ui/core/view/view";
7+
import { View } from "tns-core-modules/ui/core/view";
78

89
@Component({
910
selector: "ns-reactive-forms-example",
1011
moduleId: module.id,
1112
styleUrls: ["reactive-forms-example.component.css"],
1213
templateUrl: "./reactive-forms-example.component.html"
1314
})
14-
export class ReactiveFormsExampleComponent implements OnInit {
15+
export class ReactiveFormsExampleComponent {
1516
public pickerItems: ObservableArray<Movie>;
1617
@ViewChild("picker", { static: false }) pickerComp: PickerFieldComponent;
1718

@@ -33,14 +34,8 @@ export class ReactiveFormsExampleComponent implements OnInit {
3334
});
3435
}
3536

36-
ngOnInit(): void {
37-
this.pickerClassName = (<any>this.pickerComp.nativeElement).className;
38-
}
39-
4037
public movieForm: FormGroup;
4138

42-
public pickerClassName: string;
43-
4439
public goBack() {
4540
this.routerExtensions.backToPreviousPage();
4641
}
@@ -58,15 +53,11 @@ export class ReactiveFormsExampleComponent implements OnInit {
5853
}
5954

6055
public pickerOpened(args: EventData) {
61-
this.pickerClassName = (<any>args.object).className;
62-
63-
console.log("Picker > Opened; class:", this.pickerClassName);
56+
console.log("Picker > Opened; class:", (<View>args.object).className);
6457
}
6558

6659
public pickerClosed(args: EventData) {
67-
this.pickerClassName = (<any>args.object).className;
68-
69-
console.log("Picker > Closed; class:", this.pickerClassName);
60+
console.log("Picker > Closed; class:", (<View>args.object).className);
7061
}
7162
}
7263

src/angular/nativescript-picker.directives.ts

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { ChangeDetectionStrategy, Component, ElementRef, forwardRef, IterableDiffers } from "@angular/core";
1+
import { ChangeDetectionStrategy, Component, ElementRef, forwardRef, IterableDiffers, AfterContentInit, OnDestroy } from "@angular/core";
22
import { TemplatedItemsComponent, TEMPLATED_ITEMS_COMPONENT } from "nativescript-angular/directives/templated-items-comp";
33
import { PickerField } from "../picker";
44
import { PickerValueAccessor } from "./nativescript-picker.accessors";
5+
import { View } from "tns-core-modules/ui/core/view";
56

67
@Component({
78
selector: "PickerField",
@@ -12,17 +13,40 @@ import { PickerValueAccessor } from "./nativescript-picker.accessors";
1213
changeDetection: ChangeDetectionStrategy.OnPush,
1314
providers: [{ provide: TEMPLATED_ITEMS_COMPONENT, useExisting: forwardRef(() => PickerFieldComponent) }]
1415
})
15-
export class PickerFieldComponent extends TemplatedItemsComponent {
16+
export class PickerFieldComponent extends TemplatedItemsComponent implements AfterContentInit {
17+
private _className: string;
18+
1619
public get nativeElement(): PickerField {
1720
return this.templatedItemsView;
1821
}
1922

23+
public get className(): string {
24+
return this._className;
25+
}
26+
2027
protected templatedItemsView: PickerField;
2128

2229
constructor(_elementRef: ElementRef,
2330
_iterableDiffers: IterableDiffers) {
2431
super(_elementRef, _iterableDiffers);
2532
}
33+
34+
ngAfterContentInit() {
35+
super.ngAfterContentInit();
36+
this.nativeElement.on("classNameChange", this.onClassNameChange.bind(this));
37+
}
38+
39+
ngOnDestroy() {
40+
if (this.nativeElement) {
41+
this.nativeElement.off("classNameChange", this.onClassNameChange.bind(this));
42+
}
43+
44+
super.ngOnDestroy();
45+
}
46+
47+
private onClassNameChange(args) {
48+
this. _className = (<View>args.object).className;
49+
}
2650
}
2751

2852
export const DIRECTIVES = [PickerFieldComponent, PickerValueAccessor];

0 commit comments

Comments
 (0)