代码之家  ›  专栏  ›  技术社区  ›  Stephen Alejandro Alcalde

如何使用angular2 nativescript在listview中隐藏某些行项目

  •  1
  • Stephen Alejandro Alcalde  · 技术社区  · 7 年前

    我在控制台日志中进行了测试,对于前三项,上述两个条件是相等的。

    基于此,我需要隐藏该项目。我尝试了以下代码。这对我不起作用。

    html:

    <GridLayout >
        <ListView (setupItemView)="onSetupItemView($event)" [items]="allFeedItems" class="list-group">
            <ng-template let-item="item" let-visible="visible">
                <StackLayout [visibility]="visible ? 'visible' : 'collapsed'" class="card-view" margin="10">
    
                <StackLayout>
    
                    <StackLayout orientation="horizontal">
                        <Image src={{item.iconName}} stretch="none" class="item-icon"></Image>
                        <Label class="item-category" [text]="item.category"></Label>
                    </StackLayout>
                    <StackLayout orientation="horizontal">
                        <Label class="item-time" text="4 hours ago"></Label>
                    </StackLayout>
                    <StackLayout orientation="vertical">
                        <Image src={{item.imageUrl}} stretch="aspectFill" width="100%" height="50%" class="item-image"></Image>
                        <Label class="item-title" [text]="item.title" textWrap="true"></Label>
                    </StackLayout>
    
                </StackLayout>
    
                </StackLayout>
            </ng-template>
        </ListView>     
    
    
        <Image src="res://pref_circle" (setupItemView)="showModal($event)" verticalAlignment="bottom" horizontalAlignment="right" minWidth="45"  height ="45" ></Image>
    

    我正在使用模式自定义对话框屏幕。当从模式对话框返回时,其触发代码如下:

    ts文件:

        public showModal(args: SetupItemViewArgs) {
        let options = {
            context: {},
            fullscreen: true,
            viewContainerRef: this.vcRef
        };
    
        this.modal.showModal(ModalComponent, options).then(res => {
            console.log("Res:", res);
    
            console.log("PrintCategory2", StatusBar.categoryArr);
    
            let i = args.index;
            let barCategory = StatusBar.categoryArr[i];
            let dataCategory = this.allFeedItems[i].category;
    
            if (barCategory === dataCategory) {
                args.view.context.visible = false;
            } else {
                args.view.context.visible = true;
            }
    
    
        });
    

    this.modal.showModal(ModalComponent, options).then(res => .

    我的问题是:单击模式对话框时不会触发。因为我在此方法中添加了SetUpItemViewArgs: public showModal(args: SetupItemViewArgs)

    1 回复  |  直到 7 年前
        1
  •  2
  •   Community CDub    4 年前

    解决方案1:使用可观察

    此解决方案是通过使用 BehaviorSubject async 管道,并删除要隐藏在数组中的行项目。每次更改主题中的值时,整个列表都会更新。

    import {BehaviorSubject} from "rxjs/BehaviorSubject";
    
    ...
    
    public items$: BehaviorSubject<Array<any>> = new BehaviorSubject([]);
    constructor() {
        //may be it's not in constructor but after you got allFeedItems
        this.items$.next(this.allFeedItems);
    }
    public hideSomeRow() {
        for (let i = 0; i < this.allFeedItems.length; i++) {
            let barCategory = StatusBar.categoryArr[i];
            let dataCategory = this.allFeedItems[i].category;
    
            if (barCategory === dataCategory) {
                // remove the item from array 
                this.allFeedItems.splice(i, 1);
            }
        }
        //update to the new value
        this.items$.next([...this.allFeedItems]);
    }
    

    您的观点:

    <ListView [items]="items$ | async" class="list-group">
        <ng-template let-item="item" let-index="index">
            <StackLayout class="card-view" margin="10">
    
            <StackLayout>
    
                <StackLayout orientation="horizontal">
                    <Image src={{item.iconName}} stretch="none" class="item-icon"></Image>
                    <Label class="item-category" [text]="item.category"></Label>
                </StackLayout>
    
                <StackLayout orientation="horizontal">
                    <Label class="item-time" text="4 hours ago"></Label>
                </StackLayout>
    
                <StackLayout orientation="vertical">
                    <Image src={{item.imageUrl}} stretch="aspectFill" width="100%" height="50%" class="item-image"></Image>
                    <Label class="item-title" [text]="item.title" textWrap="true"></Label>
    
                </StackLayout>
    
            </StackLayout>
    
            </StackLayout>
        </ng-template>
    </ListView>    
    <Image (tap)="hideSomeRow()" ... class="item-image"></Image>
    

    (在操作后隐藏某些行/删除某些项)

    如果项目的语句应该隐藏或可见,则需要将其存储在数组变量中。

    public isVisible: Array<boolean> = [];
    public hideSomeRow() {
        for (let i = 0; i < this.allFeedItems.length; i++) {
            let barCategory = StatusBar.categoryArr[i];
            let dataCategory = this.allFeedItems[i].category;
    
            if (barCategory === dataCategory) {
                // remove the item from array 
                this.allFeedItems.splice(i, 1);
            }
        }
        this._changeDetectorRef.markForCheck();
    }
    

    现在在您的html中,没有要更改的内容:

    <ListView [items]="allFeedItems" class="list-group">
        <ng-template let-item="item" let-index="index">
            <StackLayout class="card-view" margin="10">
    
            <StackLayout>
    
                <StackLayout orientation="horizontal">
                    <Image src={{item.iconName}} stretch="none" class="item-icon"></Image>
                    <Label class="item-category" [text]="item.category"></Label>
                </StackLayout>
    
                <StackLayout orientation="horizontal">
                    <Label class="item-time" text="4 hours ago"></Label>
                </StackLayout>
    
                <StackLayout orientation="vertical">
                    <Image src={{item.imageUrl}} stretch="aspectFill" width="100%" height="50%" class="item-image"></Image>
                    <Label class="item-title" [text]="item.title" textWrap="true"></Label>
    
                </StackLayout>
    
            </StackLayout>
    
            </StackLayout>
        </ng-template>
    </ListView>    
    <Image (tap)="hideSomeRow()" ... class="item-image"></Image>