два Listview внутри tabview не работают должным образом - PullRequest
1 голос
/ 31 мая 2019

У меня есть совместный код проекта Nativescript-Angular.Я использую два ListView's в загруженном модуле Lazy.Ленивый загруженный модуль структурирован таким образом, что при переходе к этому модулю из 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, вкладка-1 enter image description here

Кейс 1 таб-2 enter image description here

Кейс 2 таб-1 Case 2-picture-1

Case 2 tab-2 Case 2-picture-2

У предметов всегда есть более одного элемента, но проблема все еще возникает.

Я пыталсяиспользуя функцию listview.refresh(), но все равно безуспешно.Я также использовал ChangedDetectionStratergy.OnPush и вызывал markedForRefresh функцию при получении данных.Я пытался использовать ObservableArray, предоставленный Nativescript, но я был немного озадачен при его использовании, а также почувствовал, что он недоступен для проекта совместного использования кода.

Я разочарован со вчерашнего дня и это выглядит как ошибкав родном скрипте.Можете ли вы помочь преодолеть это так, чтобы обе вкладки отображали данные всегда (зная, что массивы всегда содержат хотя бы один элемент)?

1 Ответ

0 голосов
/ 17 июля 2019

Два просмотра списка работают внутри 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 { }`

browse.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>`

browse.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();
}
}

`

browse.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 { }`

Обзор-routing.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 { }

`

Пример доступен здесь: - URL детской игровой площадки

...