我有一个带有3个选项卡的简单项目。当用户在第一个选项卡上的项目上击中一个按钮时,我需要该项目移至第二个选项卡,反之亦然。(发生这种情况时,我还需要通知服务器)。我有什么办法将项目对象传递到"大约页"选项卡中的数组?
home.html
<ion-header>
<ion-toolbar>
<ion-title>Home</ion-title>
<ion-buttons end>
<button ion-button icon-only color="royal" (click)="updateData()">
<ion-icon name="refresh"></ion-icon>
</button>
</ion-buttons>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-list>
<ion-item-sliding *ngFor="let item of items">
<ion-item>
<ion-icon name="alert" *ngIf="!item.taken" item-left></ion-icon>
<ion-icon name="checkmark-circle-outline" *ngIf="item.taken" item-left></ion-icon>
<h2><b>{{item.title}}</b></h2>
<h3>{{item.name}} | {{item.number}}</h3>
<h3 style="white-space: normal;"><b>Details:</b> {{item.text}}</h3>
</ion-item>
<ion-item-options side="left">
<button ion-button color="primary" (click)="smsPressed(item)">
<ion-icon name="text"></ion-icon>
Text
</button>
<button ion-button color="secondary" (click)="phonePressed(item)">
<ion-icon name="call"></ion-icon>
Call
</button>
</ion-item-options>
<ion-item-options side="right">
<button ion-button color="primary" *ngIf="item.taken" (click)="responderPressed(item)">
<ion-icon name="person"></ion-icon>
Responder
</button>
<button ion-button color="primary" *ngIf="!item.taken" (click)="takecallPressed(item)">
<ion-icon name="navigate"></ion-icon>
Take Call
</button>
</ion-item-options>
</ion-item-sliding>
</ion-list>
<ion-fab right bottom>
<button ion-fab color="light" (click)="addItem()"><ion-icon name="add"></ion-icon></button>
</ion-fab>
</ion-content>
home.ts
import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import { AlertController } from 'ionic-angular';
@Component({
selector: 'page-home',
templateUrl: 'home.html'
})
export class HomePage {
items: any[];
constructor(public navCtrl: NavController, public alertCtrl: AlertController) {
this.items = []
this.items.push({
title: "Title",
text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam pretium quam at est porta fringilla.",
name: "Sam",
number: "(555) 555-5555",
taken: true,
responder: {
name: "Bob",
phone: "(666) 666-6666"
}
})
this.items.push({
title: "Stuff",
text: "Take Now",
name: "Sam",
number: "(555) 555-5555",
taken: false,
responder: {}
})
}
buttonPressed(item){
alert(item.title)
}
smsPressed(item){alert(item.number)}
phonePressed(item){alert(item.number)}
responderPressed(item){alert(item.responder.name)}
takecallPressed(item){alert(item.taken)}
updateData(){
this.items.unshift({
title: "Added",
text: "Take Now",
name: "Sam",
number: "(555) 555-5555",
taken: false,
responder: {}
})
}
addItem(){
let prompt = this.alertCtrl.create({
title: 'Add Call',
message: "Enter the details for the call you want to add",
inputs: [
{ name: 'title', placeholder: 'Title'},
{ name: 'text', placeholder: 'Details'},
{ name: 'name', placeholder: 'Name'},
{ name: 'number', placeholder: 'Number'},
],
buttons: [
{ text: 'Cancel',handler: data => {}},
{ text: 'Save',handler: data => {
this.items.unshift({
title: data.title,text: data.text,
name: data.name,number: data.number,
taken: false,responder: {}
})
}
}
]
});
prompt.present();
}
}
tabs.html
<ion-tabs>
<ion-tab [root]="tab1Root" tabTitle="Home" tabIcon="home"></ion-tab>
<ion-tab [root]="tab2Root" tabTitle="Current" tabIcon="alarm"></ion-tab>
<ion-tab [root]="tab3Root" tabTitle="Account" tabIcon="contacts"></ion-tab>
</ion-tabs>
tabs.ts
import { Component } from '@angular/core';
import { HomePage } from '../home/home';
import { AboutPage } from '../about/about';
import { ContactPage } from '../contact/contact';
@Component({
templateUrl: 'tabs.html'
})
export class TabsPage {
// this tells the tabs component which Pages
// should be each tab's root Page
tab1Root: any = HomePage;
tab2Root: any = AboutPage;
tab3Root: any = ContactPage;
constructor() {
}
}
有几种方法可以实现这一目标。
-
Events
在传递数据时将是正确的选择在不同页面之间。事件是用于发送和 响应您的应用程序上的应用程序级事件。
用
创建事件constructor(public events: Events) {} function sendData(data) { events.publish('data:created', data); }
使用
订阅它events.subscribe('data:created', (data) => { console.log( data); });
-
使用共享服务
constructor(public shared: Share) {} pushData(data){ this.shared.items.push(data); }
当您在
app.module.ts
中注入全球服务时,可以使用
this.shared.items
在其他组件中访问items
- 另一个选择是使用
segments
而不是tabs
。这取决于用例。对于简单的应用程序,这将是更好的解决方案。您可以从文档中了解更多。
编辑
我避免将数据存储在数据库中,因为它不是这样做的有效方法。但是这种方法可能有用例。
localstorage - 这可能是您可以解决的方法之一。
使用 -
从1个选项卡进行特定操作后,您可以将必要的数据存储在本地存储中let data = {"demo": "demo"};
localStorage.setItem('myData',JSON.stringify(data));
现在,在另一个选项卡中,您可以使用Ionic的生命周期甚至ionViewWillEnter()
,每当输入视图时都会执行,以便将数据刷新。在这里,您可以访问localStorage
中存储的数据:
ionViewWillEnter(){
let data = JSON.parse(localStorage.getItem('myData'));
console.log("Did data load? : ",data);
}
NOTE :您需要在localStorage
中存储和检索时使用JSON.stringify()
和JSON.parse()
,因为您只能在其中存储字符串。
我知道,旧线程和可观察/事件是一个好方法,
但在离子中,标签是每个选项卡的另一个离子router-outlet。因此,您已经有了ActivatedRoute。您可能会认为您的选项卡组件中的激活程序仅适用于特定的离子router-outlet,并且它不会包含您的标签。
这是解析器存储其已解决数据的地方。
在您的tabs.ts中,只需填充此值(使用解析器或离子反弹或其他情况)
this.activatedRoute.snapshot.data['yourData'];
,在每个选项卡组件中,您可以通过以下方式访问它:
this.activatedRoute.snapshot.parent.data['yourData'];
不要忘记将ActivatedRoute对象注入构造函数。
另外,请注意这是离子4/5的解决方案,我不知道它是否适用于3和更早。