首页 > 解决方案 > tabview 中的两个 Listview 不能按预期工作

问题描述

我有一个代码共享 Nativescript-Angular 项目。我ListView's在延迟加载的模块中使用了两个。延迟加载模块的结构使得当我从 AppModule 导航到该模块时。

<TabView id="tabViewContainer">
    <page-router-outlet  actionBarVisibility="never"  *tabItem="{title: 'Players'}" name="playersTab"></page-router-outlet>
    <page-router-outlet  actionBarVisibility="never" *tabItem="{title: 'Event Requests'}" name="eventRequestsTab"></page-router-outlet>
</TabView>

现在每个选项卡项都是一个page-router-outlet路由到子组件的路由,并且该子组件具有ListView父元素,如下所示。

<ListView
  class="list-group"
  [items]="players"

  (loaded)="onListViewLoaded($event)"
  #listView
>
  <ng-template let-player="item" let-third="third">
    <GridLayout class="list-group-item" rows="*" columns="auto, *">
      <Image
      col="0"
      [src]="player.photoURL"
      class="thumb img-circle"
    ></Image>
      <StackLayout col="1">
        <Label
          [text]="player.displayName"
          class="list-group-item-heading"
        ></Label>
        <Label
          [text]="player.uid"
          class="list-group-item-text"
          textWrap="true"
        ></Label>
      </StackLayout>
    </GridLayout>
  </ng-template>
</ListView>

现在我面临的问题是,当这两个列表视图并排显示时,有时两个列表视图都不显示任何内容,有时只有第二个选项卡显示数据,而第一个选项卡仅显示项目分隔符,如下所示:-

案例 1 tab-1 在此处输入图像描述

案例 1 tab-2 在此处输入图像描述

案例 2 tab-1 案例2-图片-1

案例 2 tab-2 案例2-图片-2

这些项目总是有一个以上的元素,但仍然会出现这个问题。

我尝试过使用该功能listview.refresh(),但仍然没有成功。收到数据时,我也使用ChangedDetectionStratergy.OnPush并调用了函数。markedForRefresh我尝试过使用ObservableArray提供的,Nativescript但在使用时我有点困惑,而且我觉得它不适用于代码共享项目。

从昨天开始我就很沮丧,它看起来像是 Nativescript 中的一个错误。您能否帮助克服它,以便两个选项卡始终显示数据(知道数组始终具有至少一个元素)?

标签: angular2-nativescript

解决方案


两个列表视图在 tabView 内工作,例如:-

app.component.html :-

`<TabView androidTabsPosition="bottom">

<page-router-outlet *tabItem="{title: 'Home', iconSource: getIconSource('home')}"
    name="homeTab">
</page-router-outlet>

<page-router-outlet *tabItem="{title: 'Browse', iconSource: getIconSource('browse')}"
    name="browseTab">
</page-router-outlet>

</TabView>`

app.component.ts:-

`import { Component, OnInit } from "@angular/core";

 import { isAndroid } from "tns-core-modules/platform";

@Component({
selector: "ns-app",

moduleId: module.id,

templateUrl: "app.component.html"
})
export class AppComponent implements OnInit {

constructor() {
    // Use the component constructor to inject providers.
}

ngOnInit(): void {
    // Init your component properties here.
}

getIconSource(icon: string): string {
    const iconPrefix = isAndroid ? "res://" : "res://tabIcons/";

    return iconPrefix + icon;
}
}

` app.module.ts :-

`import { NgModule, NO_ERRORS_SCHEMA } from "@angular/core";
 import { NativeScriptModule } from "nativescript-angular/nativescript.module";

import { AppRoutingModule } from "./app-routing.module";
import { AppComponent } from "./app.component";

@NgModule({
bootstrap: [
    AppComponent
],
imports: [
    NativeScriptModule,
    AppRoutingModule
],
declarations: [
    AppComponent
],
schemas: [
    NO_ERRORS_SCHEMA
]
})
export class AppModule { }

`

app.routing.ts :-

`import { NgModule } from "@angular/core";

import { Routes } from "@angular/router";

import { NSEmptyOutletComponent } from "nativescript-angular";

import { NativeScriptRouterModule } from "nativescript-angular/router";

const routes: Routes = [
{
    path: "",

    redirectTo: "/(homeTab:home/default//browseTab:browse/default)",

    pathMatch: "full"
},

{
    path: "home",

    component: NSEmptyOutletComponent,

    loadChildren: "~/app/home/home.module#HomeModule",

    outlet: "homeTab"
},
{
    path: "browse",

    component: NSEmptyOutletComponent,

    loadChildren: "~/app/browse/browse.module#BrowseModule",

    outlet: "browseTab"
}
];

@NgModule({

imports: [NativeScriptRouterModule.forRoot(routes)],

exports: [NativeScriptRouterModule]
})

export class AppRoutingModule { }

`

home.component.html :-

`<GridLayout class="page page-content">

<ListView [items]="items" class="list-group">

    <ng-template let-item="item">

        <ScrollView height="150">

            <Label [text]="item.name" class="list-group-item"></Label>

        </ScrollView>

    </ng-template>

</ListView>

</GridLayout>`

home.component.ts:-

`import { Component, OnInit } from "@angular/core";
import { DataService, IDataItem } from "../shared/data.service";

@Component({
selector: "Home",
moduleId: module.id,
templateUrl: "./home.component.html"
})
export class HomeComponent implements OnInit {

items: Array<IDataItem>;

constructor(private _itemService: DataService) { }

ngOnInit(): void {
    this.items = this._itemService.getItems();
}
}` 

home.module.ts:-

`import { NgModule, NO_ERRORS_SCHEMA } from "@angular/core";

import { NativeScriptCommonModule } from "nativescript-angular/common";

import { HomeRoutingModule } from "./home-routing.module";

import { HomeComponent } from "./home.component";

import { ItemDetailComponent } from "./item-detail/item-detail.component";

@NgModule({

imports: [
    NativeScriptCommonModule,
    HomeRoutingModule
],

declarations: [
    HomeComponent,
    ItemDetailComponent
],

schemas: [
    NO_ERRORS_SCHEMA
]

})

export class HomeModule { }`

home-routing.module.ts:-

`import { NgModule } from "@angular/core";

import { Routes } from "@angular/router";

import { NativeScriptRouterModule } from "nativescript-angular/router";

import { HomeComponent } from "./home.component";

import { ItemDetailComponent } from "./item-detail/item-detail.component";

const routes: Routes = [

{ path: "default", component: HomeComponent },

{ path: "item/:id", component: ItemDetailComponent }

];

@NgModule({

imports: [NativeScriptRouterModule.forChild(routes)],

exports: [NativeScriptRouterModule]

})

export class HomeRoutingModule { }`

浏览.component.html :-

`<GridLayout class="page page-content">

<ListView [items]="items" class="list-group">

    <ng-template let-item="item">

        <ScrollView height="150">

            <Label [text]="item.name" class="list-group-item"></Label>

        </ScrollView>

    </ng-template>

</ListView>

</GridLayout>`

浏览.component.ts:-

`import { Component, OnInit } from "@angular/core";
import { DataService, IDataItem } from "../shared/data.service";

@Component({
selector: "Browse",
moduleId: module.id,
templateUrl: "./browse.component.html"
})
export class BrowseComponent implements OnInit {

items: Array<IDataItem>;

constructor(private _itemService: DataService) { }

ngOnInit(): void {
    this.items = this._itemService.getItems();
}
}

`

浏览.module.ts:-

`import { NgModule, NO_ERRORS_SCHEMA } from "@angular/core";

import { NativeScriptCommonModule } from "nativescript-angular/common";

import { BrowseRoutingModule } from "./browse-routing.module";

import { BrowseComponent } from "./browse.component";

import { DataService } from "../shared/data.service";

@NgModule({
imports: [
    NativeScriptCommonModule,
    BrowseRoutingModule
],
declarations: [
    BrowseComponent
],
schemas: [
    NO_ERRORS_SCHEMA
],
providers:[
    DataService
]
})
export class BrowseModule { }`

浏览路由.module.ts:-

`import { NgModule } from "@angular/core";

import { Routes } from "@angular/router";

import { NativeScriptRouterModule } from "nativescript-angular/router";

import { BrowseComponent } from "./browse.component";

const routes: Routes = [

{ path: "default", component: BrowseComponent }

];

@NgModule({

imports: [NativeScriptRouterModule.forChild(routes)],

exports: [NativeScriptRouterModule]

})

export class BrowseRoutingModule { }

`

此处提供的示例:- Nativescript 游乐场网址


推荐阅读