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: '&#xf015;'}" style="font-size: 20">
        <Label [nsRouterLink]="['/start']" width="30"  class="mdi" [text]="'mdi-home' | fonticon"></Label>
    </StackLayout>
    <StackLayout *tabItem="{title: '&#xf1ea;'}">
        <Label [nsRouterLink]="['/start']" width="30"  class="mdi" [text]="'mdi-message' | fonticon"></Label>
    </StackLayout>
    <StackLayout *tabItem="{title: '&#xf07b;'}">
        <Label [nsRouterLink]="['/start']" width="30"  class="mdi" [text]="'mdi-folder' | fonticon"></Label>
    </StackLayout>
    <StackLayout *tabItem="{title: '&#xf005;'}">
        <Label [nsRouterLink]="['/start']" width="30"  class="mdi" [text]="'mdi-star' | fonticon"></Label>
    </StackLayout>
    <StackLayout *tabItem="{title: '&#xf059;'}">
        <Label [nsRouterLink]="['/start']" width="30"  class="mdi" [text]="'mdi-star' | fonticon"></Label>
    </StackLayout>
</TabView>

Спасибо за вашу помощь в решении этой проблемы.

1 ответ

Проблема в том, что он, кажется, вызывает "onSelectedIndexChanged" уже перед "ngOnInit", а также много раз. Поэтому я сделал переплет неправильно, но есть простой выход.

  1. Измените вызов метода на (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: '&#xf015;'}" style="font-size: 20">
        <Label [nsRouterLink]="['/start']" width="30"  class="mdi" [text]="'mdi-home' | fonticon"></Label>
        </StackLayout>
        <StackLayout *tabItem="{title: '&#xf1ea;'}">
        <Label [nsRouterLink]="['/start']" width="30"  class="mdi" [text]="'mdi-message' | fonticon"></Label>
        </StackLayout>
        <StackLayout *tabItem="{title: '&#xf07b;'}">
        <Label [nsRouterLink]="['/start']" width="30"  class="mdi" [text]="'mdi-folder' | fonticon"></Label>
        </StackLayout>
        <StackLayout *tabItem="{title: '&#xf005;'}">
        <Label [nsRouterLink]="['/start']" width="30"  class="mdi" [text]="'mdi-star' | fonticon"></Label>
        </StackLayout>
        <StackLayout *tabItem="{title: '&#xf059;'}">
        <Label [nsRouterLink]="['/start']" width="30"  class="mdi" [text]="'mdi-star' | fonticon"></Label>
        </StackLayout>
    </TabView>
    
  2. Измените метод внутри компонента, чтобы он выполнялся только в том случае, если значение изменилось.

    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;
        }
        }
     }
    
Другие вопросы по тегам