Nativescript Angular Tabview Binding
Я использую nativescript с angular2 и tabview. Пока что табуляция работает хорошо, и я также могу получить и установить tabIndex, нажимая или проводя между tabItems.
Моя проблема сейчас в том, что, если событие "onSelectedIndexChanged" запущено, я не могу установить заголовок заголовка с привязкой данных. Выдает ошибку "ExpressionChangedAfterItHasBeenCheckedError".
Вот содержание компонента:
import { Component, OnInit, EventEmitter, Output } from "@angular/core";
import { ConfigService } from "../../services/config.service";
import { CustomerService } from "../../services/customer.service";
import { UserService } from "../../services/user.service";
@Component({
selector: "app-header",
templateUrl: "./components/shared/header.component.html",
styleUrls: ["./components/shared/header.component.css"]
})
export class HeaderComponent implements OnInit {
@Output() openMenuEmmiter = new EventEmitter<boolean>();
customer_image: string;
isAuthenticated: boolean = false;
tabSelectedIndex: number;
menuPointTitle: string;
constructor (private _configService: ConfigService, private _customerService: CustomerService, private _userService: UserService) {
}
ngOnInit() {
this.tabSelectedIndex = 0;
this.menuPointTitle = "Home";
this._userService.getIsAuthenticated().subscribe(
(state) => {this.isAuthenticated = state;}
);
this._customerService.getCurrentCustomer().subscribe(
(customer) => {this.customer_image = customer.image;}
);
}
onOpenMenu () {
this.openMenuEmmiter.emit(true);
}
onSelectedIndexChanged() {
this.menuPointTitle = this.tabSelectedIndex+"test";
console.log(this.tabSelectedIndex);
}
}
HTML-код является следующим:
<StackLayout class="accent">
<FlexboxLayout flexDirection="column">
<FlexboxLayout>
<Label flexGrow="1" [text]="menuPointTitle" style="font-size: 18; font-weight: bold;"></Label>
<Label [nsRouterLink]="['/start']" width="30" class="mdi" [text]="'mdi-notifications' | fonticon" style="font-size: 24"></Label>
<Label [nsRouterLink]="['/login']" width="30" class="mdi" [text]="'mdi-more-vert' | fonticon" style="font-size: 24"></Label>
</FlexboxLayout>
</FlexboxLayout>
</StackLayout>
<TabView [(ngModel)]="tabSelectedIndex" [selectedIndexChanged]="onSelectedIndexChanged()" tabsBackgroundColor="#97201A" selectedTabTextColor="#FFFFFF" tabTextColor="#DB645E" selectedColor="#FFFFFF" class="fa" style="margin: 0; font-size: 20;">
<StackLayout *tabItem="{title: ''}" style="font-size: 20">
<Label [nsRouterLink]="['/start']" width="30" class="mdi" [text]="'mdi-home' | fonticon"></Label>
</StackLayout>
<StackLayout *tabItem="{title: ''}">
<Label [nsRouterLink]="['/start']" width="30" class="mdi" [text]="'mdi-message' | fonticon"></Label>
</StackLayout>
<StackLayout *tabItem="{title: ''}">
<Label [nsRouterLink]="['/start']" width="30" class="mdi" [text]="'mdi-folder' | fonticon"></Label>
</StackLayout>
<StackLayout *tabItem="{title: ''}">
<Label [nsRouterLink]="['/start']" width="30" class="mdi" [text]="'mdi-star' | fonticon"></Label>
</StackLayout>
<StackLayout *tabItem="{title: ''}">
<Label [nsRouterLink]="['/start']" width="30" class="mdi" [text]="'mdi-star' | fonticon"></Label>
</StackLayout>
</TabView>
Спасибо за вашу помощь в решении этой проблемы.
1 ответ
Проблема в том, что он, кажется, вызывает "onSelectedIndexChanged" уже перед "ngOnInit", а также много раз. Поэтому я сделал переплет неправильно, но есть простой выход.
Измените вызов метода на (selectedIndexChanged)="onSelectedIndexChanged($event)", чтобы получить аргументы события.
<StackLayout class="accent"> <FlexboxLayout flexDirection="column"> <FlexboxLayout> <Label flexGrow="1" [text]="menuPointTitle" style="font-size: 18; font-weight: bold;"></Label> <Label [nsRouterLink]="['/start']" width="30" class="mdi" [text]="'mdi-notifications' | fonticon" style="font-size: 24"></Label> <Label [nsRouterLink]="['/login']" width="30" class="mdi" [text]="'mdi-more-vert' | fonticon" style="font-size: 24"></Label> </FlexboxLayout> </FlexboxLayout> </StackLayout> <TabView [(ngModel)]="tabSelectedIndex" (selectedIndexChanged)="onSelectedIndexChanged($event)" tabsBackgroundColor="#97201A" selectedTabTextColor="#FFFFFF" tabTextColor="#DB645E" selectedColor="#FFFFFF" class="fa" style="margin: 0; font-size: 20;"> <StackLayout *tabItem="{title: ''}" style="font-size: 20"> <Label [nsRouterLink]="['/start']" width="30" class="mdi" [text]="'mdi-home' | fonticon"></Label> </StackLayout> <StackLayout *tabItem="{title: ''}"> <Label [nsRouterLink]="['/start']" width="30" class="mdi" [text]="'mdi-message' | fonticon"></Label> </StackLayout> <StackLayout *tabItem="{title: ''}"> <Label [nsRouterLink]="['/start']" width="30" class="mdi" [text]="'mdi-folder' | fonticon"></Label> </StackLayout> <StackLayout *tabItem="{title: ''}"> <Label [nsRouterLink]="['/start']" width="30" class="mdi" [text]="'mdi-star' | fonticon"></Label> </StackLayout> <StackLayout *tabItem="{title: ''}"> <Label [nsRouterLink]="['/start']" width="30" class="mdi" [text]="'mdi-star' | fonticon"></Label> </StackLayout> </TabView>
Измените метод внутри компонента, чтобы он выполнялся только в том случае, если значение изменилось.
import { Component, OnInit, EventEmitter, Output } from "@angular/core"; import { ConfigService } from "../../services/config.service"; import { CustomerService } from "../../services/customer.service"; import { UserService } from "../../services/user.service"; @Component({ selector: "app-header", templateUrl: "./components/shared/header.component.html", styleUrls: ["./components/shared/header.component.css"] }) export class HeaderComponent implements OnInit { @Output() openMenuEmmiter = new EventEmitter<boolean>(); customer_image: string; isAuthenticated: boolean = false; tabSelectedIndex: number; menuPointTitle: string; constructor (private _configService: ConfigService, private _customerService: CustomerService, private _userService: UserService) { } ngOnInit() { this.tabSelectedIndex = 0; this.menuPointTitle = "Home"; this._userService.getIsAuthenticated().subscribe( (state) => {this.isAuthenticated = state;} ); this._customerService.getCurrentCustomer().subscribe( (customer) => {this.customer_image = customer.image;} ); } onOpenMenu () { this.openMenuEmmiter.emit(true); } onSelectedIndexChanged(args) { if (args.newIndex != args.oldIndex) { console.log(args.newIndex); this.menuPointTitle = "test"+args.newIndex; } } }