刷新 ListView 在运行时在 NativeScript 和 Angular 中添加新元素
Refresh a ListView adding new elements on runtime in NativeScript and Angular
我正在构建一个基于 ListView 的组件,类似于 {N} 页面中的杂货示例。我有一个“+”按钮,需要将新项目添加到列表中,我有这个代码:
import { Component, OnInit } from '@angular/core';
@Component({
moduleId: module.id,
selector: 'my-list',
templateUrl: 'my-list.component.html'
})
export class ListComponent implements OnInit {
private myList: CustomObject;
constructor() { }
ngOnInit() { }
addItem(){
this.myList.push(new CustomObject());
}
}
这是模板:
<StackLayout>
<Button text="+" (tap)="addItem()" ></Button>
<ListView [items]="myList">
<template let-item="item" let-i="i">
<Label text="item.name"></Label>
</template>
</ListView>
</StackLayout>
我的问题是,当我单击“+”按钮时,出现无法描述的异常。当我用代码填充列表时,没问题,但我需要用户可以向视图添加新元素。像我描述的那样实现动态 ListView 的正确方法是什么?
编辑:
An uncaught Exception ocurred on "main" thread.
com.tns.NativeScriptException: Calling js method getView failded
Error No suitable views found in list template! Nesting level:0 File:
"/data/data/org.nativescript.MyApp/files/app/tns_moudules/nativescript-angular/directives/list-view-comp.js,
line:135 column:8
StackTrace: Frame: function:'getSingleViewRecursive', file:....
在 NativeScript + Angular-2 应用程序中你可以使用 AsyncPipe
可以找到有关如何在 NativeScript + NG2 应用程序中通过异步管道提供数据的示例 here
值得注意的是 RxObservable
的用法
page.component.ts
import { Component, ChangeDetectionStrategy } from "@angular/core";
import { Observable as RxObservable } from "rxjs/Observable";
export class DataItem {
constructor(public id: number, public name: string) { }
}
@Component({
templateUrl: "ui-category/listview/using-async-pipe/using-async-pipe.component.html",
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class UsingAsyncPipeComponent {
public myItems: RxObservable<Array<DataItem>>;
constructor() {
let items = [];
for (let i = 0; i < 3; i++) {
items.push(new DataItem(i, "data item " + i));
}
let subscr;
this.myItems = RxObservable.create(subscriber => {
subscr = subscriber;
subscriber.next(items);
return function () {
console.log("Unsubscribe called!");
};
});
let counter = 2;
let intervalId = setInterval(() => {
counter++;
items.push(new DataItem(counter + 1, "data item " + (counter + 1)));
subscr.next(items);
}, 1000);
setTimeout(() => {
clearInterval(intervalId);
}, 15000);
}
}
page.component.html
<ListView [items]="myItems | async" class="list-group">
<template let-item="item" let-i="index" let-odd="odd" let-even="even">
<GridLayout class="list-group-item" [class.odd]="odd" [class.even]="even">
<Label [text]="item.name" android:class="label-item"></Label>
</GridLayout>
</template>
</ListView>
在这个基本示例中,异步是使用 setInterval 模拟的,但基于相同的逻辑,您可以使用按钮实现所需的用户体验。
我正在构建一个基于 ListView 的组件,类似于 {N} 页面中的杂货示例。我有一个“+”按钮,需要将新项目添加到列表中,我有这个代码:
import { Component, OnInit } from '@angular/core';
@Component({
moduleId: module.id,
selector: 'my-list',
templateUrl: 'my-list.component.html'
})
export class ListComponent implements OnInit {
private myList: CustomObject;
constructor() { }
ngOnInit() { }
addItem(){
this.myList.push(new CustomObject());
}
}
这是模板:
<StackLayout>
<Button text="+" (tap)="addItem()" ></Button>
<ListView [items]="myList">
<template let-item="item" let-i="i">
<Label text="item.name"></Label>
</template>
</ListView>
</StackLayout>
我的问题是,当我单击“+”按钮时,出现无法描述的异常。当我用代码填充列表时,没问题,但我需要用户可以向视图添加新元素。像我描述的那样实现动态 ListView 的正确方法是什么?
编辑:
An uncaught Exception ocurred on "main" thread. com.tns.NativeScriptException: Calling js method getView failded
Error No suitable views found in list template! Nesting level:0 File: "/data/data/org.nativescript.MyApp/files/app/tns_moudules/nativescript-angular/directives/list-view-comp.js, line:135 column:8
StackTrace: Frame: function:'getSingleViewRecursive', file:....
在 NativeScript + Angular-2 应用程序中你可以使用 AsyncPipe
可以找到有关如何在 NativeScript + NG2 应用程序中通过异步管道提供数据的示例 here
值得注意的是 RxObservable
的用法page.component.ts
import { Component, ChangeDetectionStrategy } from "@angular/core";
import { Observable as RxObservable } from "rxjs/Observable";
export class DataItem {
constructor(public id: number, public name: string) { }
}
@Component({
templateUrl: "ui-category/listview/using-async-pipe/using-async-pipe.component.html",
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class UsingAsyncPipeComponent {
public myItems: RxObservable<Array<DataItem>>;
constructor() {
let items = [];
for (let i = 0; i < 3; i++) {
items.push(new DataItem(i, "data item " + i));
}
let subscr;
this.myItems = RxObservable.create(subscriber => {
subscr = subscriber;
subscriber.next(items);
return function () {
console.log("Unsubscribe called!");
};
});
let counter = 2;
let intervalId = setInterval(() => {
counter++;
items.push(new DataItem(counter + 1, "data item " + (counter + 1)));
subscr.next(items);
}, 1000);
setTimeout(() => {
clearInterval(intervalId);
}, 15000);
}
}
page.component.html
<ListView [items]="myItems | async" class="list-group">
<template let-item="item" let-i="index" let-odd="odd" let-even="even">
<GridLayout class="list-group-item" [class.odd]="odd" [class.even]="even">
<Label [text]="item.name" android:class="label-item"></Label>
</GridLayout>
</template>
</ListView>
在这个基本示例中,异步是使用 setInterval 模拟的,但基于相同的逻辑,您可以使用按钮实现所需的用户体验。