版权声明:作者已开启版权声明,如转载请注明转载地址。 https://blog.csdn.net/qq_34829447/article/details/85137787
一.问题列表页面布局开发
1.开发思路
- 在home页面完成列表页面的布局开发
- home页面显示开启直播间用户的头像、用户名、房间标题、房间内容及房间相关参数信息
2.实例代码
- home.html
<ion-header>
<ion-navbar>
<ion-searchbar placeholder="Search:How to dressing?"></ion-searchbar>
<ion-icon name="text" class="top_header_message_icon" (tap)="gotoQuestion()"></ion-icon>
</ion-navbar>
</ion-header>
<ion-content>
<div class="floatMenu">
<ion-grid>
<ion-row>
<ion-col col-4 text-center>
<div (tap)="gotoQuestion()">
<ion-icon name="create"></ion-icon> Quiz
</div>
</ion-col>
<ion-col col-4 text-center>
<div><span style="float:left;color:#dddddd">|</span>
<ion-icon name="albums"></ion-icon> Answer
</div><span style="float:right;color:#dddddd">|</span>
</ion-col>
<ion-col col-4 text-center>
<div (tap)="gotoQuestion()">
<ion-icon name="share-alt"></ion-icon> Sharing
</div>
</ion-col>
</ion-row>
</ion-grid>
</div>
<ion-card >
<ion-item>
<ion-avatar item-start>
<img src="">
</ion-avatar>
<p>
Sinar开启直播间
<ion-icon class="more_button" name="more"></ion-icon>
</p>
</ion-item>
<h2>直播间标题</h2>
<ion-card-content>
<p>直播间内容</p>
</ion-card-content>
<ion-row>
<ion-col col-8 center text-left>
<ion-note>
100 观看 · 20 爱心 · 查看房间
</ion-note>
</ion-col>
<ion-col col-4></ion-col>
</ion-row>
</ion-card>
</ion-content>
- home.scss
page-home {
.searchbar {
float: left;
width:90%;
}
.searchbar-input {
}
.top_header_message_icon {
float: left;
font-size: 2em;
min-height: 44px;
color: #848994;
padding: 9px 5px 9px 5px;
text-align: center;
}
.floatMenu {
width:100%;
height: 36px;
background-color: #FFFFFF;
margin-bottom: 5px;
color: #999999;
font-weight: bold;
}
//card样式
.card {
margin: 0;
margin-bottom: 10px;
width: 100%;
box-shadow: none;
}
//card中标题样式
.card h2 {
padding-left: 10px;
font-weight: bold;
font-size: 1.5rem;
}
//card中内容样式
.card p {
color: #464646;
font-size: 1.2rem;
}
.card-content {
padding-top: 6px;
padding-left: 10px;
padding-bottom: 2px;
}
.card .note {
padding-left: 5px;
font-size: 1.1rem;
}
.col {
padding-top: 0;
padding-bottom: 10px;
}
.item {
padding-left: 10px;
}
.item p {
color: #999999;
}
.item ion-avatar {
margin: 0!important;
margin-right: 5px!important;
margin-bottom: 3px!important;
min-height: 20px;
min-width: 20px;
}
.item ion-avatar img {
width: 20px;
height: 20px;
}
.more_button {
float: right;
padding-top: 3px;
}
}
二.问题列表页面的数据绑定逻辑开发
1.开发思路
- 进行页面逻辑的数据绑定
- 编写获取数据信息的函数,并在ionic的生命周期方法
ionViewDidLoad()
中调用 - 编写
selectTab()
用于直接跳转对话栏(同级Tab)
2.实例代码
- home.html
<ion-header>
<ion-navbar>
<ion-searchbar placeholder="Search:How to dressing?"></ion-searchbar>
<ion-icon name="text" class="top_header_message_icon" (tap)="gotoChat()"></ion-icon>
</ion-navbar>
</ion-header>
<ion-content>
<div class="floatMenu">
<ion-grid>
<ion-row>
<ion-col col-4 text-center>
<div (tap)="gotoQuestion()">
<ion-icon name="create"></ion-icon> Quiz
</div>
</ion-col>
<ion-col col-4 text-center>
<div>
<span style="float:left;color:#dddddd">|</span>
<ion-icon name="albums"></ion-icon> Answer
<span style="float:right;color:#dddddd">|</span>
</div>
</ion-col>
<ion-col col-4 text-center>
<div (tap)="gotoQuestion()">
<ion-icon name="share-alt"></ion-icon> Sharing
</div>
</ion-col>
</ion-row>
</ion-grid>
</div>
<ion-card *ngFor="let f of feeds;">
<ion-item>
<ion-avatar item-start>
<img src="{{f.headFace}}">
</ion-avatar>
<p>
{{f.userNickName}}开启直播间
<ion-icon class="more_button" name="more"></ion-icon>
</p>
</ion-item>
<h2>{{f.contentTitle}}</h2>
<ion-card-content>
<p>{{f.contentSummary}}</p>
</ion-card-content>
<ion-row>
<ion-col col-8 center text-left>
<ion-note>
{{f.watched}} 观看 · {{f.love}} 爱心 · 查看房间
</ion-note>
</ion-col>
<ion-col col-4></ion-col>
</ion-row>
</ion-card>
</ion-content>
- home.ts
import { Component } from '@angular/core';
import { NavController, ModalController, Tab, Tabs, LoadingController } from 'ionic-angular';
import { QuestionPage } from '../question/question';
import { BaseUI } from '../../common/baseUI';
@Component({
selector: 'page-home',
templateUrl: 'home.html'
})
export class HomePage extends BaseUI{
feeds: any[];
errorMessage: string;
constructor(
public navCtrl: NavController,
public modalCtrl: ModalController,
public loadingCtrl: LoadingController
) {
super();
}
ionViewDidLoad() {
this.getFeeds();
}
//当tap事件(手指触碰)被触发的时候执行对应函数
gotoQuestion() {
let modal = this.modalCtrl.create(QuestionPage);
modal.present();
}
//跳转到chat的tap
gotoChat() {
this.selectTab(2);
}
selectTab(index:number) {
//通过当前tab获得其所有tab内容
let t:Tabs = this.navCtrl.parent;
//选定指定tab
t.select(index);
}
//获得首页数据信息
getFeeds() {
let loading = super.showLoading(this.loadingCtrl,"Data Loading...");
setTimeout(()=>{
this.feeds = [
{"id":1,"headFace":"../../assets/imgs/avatar.jpg","userNickName":"Sinar","contentTitle":"你今天很好看","contentSummary":"这里后期添加图片...","watched":100,"love":20},
{"id":2,"headFace":"../../assets/imgs/logo.png","userNickName":"Jack","contentTitle":"快进来呀小伙伴","contentSummary":"这里后期添加图片...","watched":100,"love":20},
{"id":3,"headFace":"../../assets/imgs/avatar.jpg","userNickName":"Crystal","contentTitle":"美妆真的美","contentSummary":"这里后期添加图片...","watched":100,"love":20},
{"id":4,"headFace":"../../assets/imgs/logo.png","userNickName":"Ada","contentTitle":"Free Skin完美","contentSummary":"这里后期添加图片...","watched":100,"love":20},
{"id":5,"headFace":"../../assets/imgs/avatar.jpg","userNickName":"Ida","contentTitle":"超赞美妆","contentSummary":"这里后期添加图片...","watched":100,"love":20},
{"id":6,"headFace":"../../assets/imgs/logo.png","userNickName":"Adams","contentTitle":"妆出不一样的你","contentSummary":"这里后期添加图片...","watched":100,"love":20},
{"id":7,"headFace":"../../assets/imgs/avatar.jpg","userNickName":"Lerry","contentTitle":"你今天妆了吗","contentSummary":"这里后期添加图片...","watched":100,"love":20}
];
loading.dismiss();
},2000);
}
}
三.问题详情页面的布局开发
1.开发思路
- 创建问题详情页面
ionic g page details
- 为之前的card添加点击跳转事件,使用
this.navCtrl.push(页面)
- 编写detail页面展示内容详情及用户评论列表
2.实例代码
- details.html
<ion-header>
<ion-navbar>
<ion-title>Title Details</ion-title>
</ion-navbar>
</ion-header>
<ion-content padding>
<ion-card>
<ion-card-content>
直播的详情
<p>100 观看 · 20 爱心</p>
<button ion-button small>
<ion-icon name="add"></ion-icon>回答
</button>
<button ion-button small>
<ion-icon name="add"></ion-icon>关注
</button>
</ion-card-content>
</ion-card>
<ion-card>
<ion-item>
<ion-avatar item-start>
<img src="">
</ion-avatar>
<p>
Rae
</p>
</ion-item>
<ion-card-content>
<p>用户回答内容</p>
<p class="answer_date">2018.12.20</p>
</ion-card-content>
</ion-card>
</ion-content>
- details.scss
page-details {
.card {
margin: 0;
margin-bottom: 10px;
width: 100%;
box-shadow: none;
}
.card-content {
font-size: 1.2rem;
}
.button-default {
height: 1.8em;
font-family: 1.3rem;
float: right;
display: block;
margin-bottom: 10px;
padding: 0 0.9em;
}
.scroll-content {
padding: 0!important;
}
.card-p {
margin-top: 10px;
}
.answer_date {
float: right;
}
}
四.问题详情页面的数据加载
1.开发思路及细节
-
开发页面详情内容,模拟后台返回数据
-
需要返回直播内容信息及问题内容
-
处理可空对象
变量对象?.属性
-
获取数据使用三元表达式
变量?'...':'...'
2.实例代码
-
detail.html
<ion-header> <ion-navbar> <ion-title>{{question?.ContentTitle}}</ion-title> </ion-navbar> </ion-header> <ion-content padding> <ion-card> <ion-card-content> {{question?.Content}} <p>{{question?.watchNumber}} 观看 · {{question?.likeNumber}} 爱心</p> <button ion-button small [disabled]="isMyQuestion"> <ion-icon name="add"></ion-icon>回答 </button> <button ion-button small color="secondary" (click)="saveFavourite()"> <ion-icon name="add"></ion-icon>{{isFavourite?'取消关注':'关注'}} </button> </ion-card-content> </ion-card> <ion-card *ngFor="let a of answers"> <ion-item> <ion-avatar item-start> <img src="{{a.headFace}}"> </ion-avatar> <p> {{a.userNickname}} </p> </ion-item> <ion-card-content> <p>{{a.content}}</p> <p class="answer_date">{{a.createDateTime}}</p> </ion-card-content> </ion-card> </ion-content>
-
detail.ts
import { Component } from '@angular/core'; import { IonicPage, NavController, NavParams, LoadingController, ToastController } from 'ionic-angular'; import { BaseUI } from '../../common/baseUI'; import { Storage } from '@ionic/storage'; @Component({ selector: 'page-details', templateUrl: 'details.html', }) export class DetailsPage extends BaseUI{ id:string;//当前问题id question:any;//当前问题内容 answers:any[];//回答内容 errorMessage:any; isFavourite:boolean;//是否点击关注 isMyQuestion:boolean;//是否是当前用户的问题 constructor( public navCtrl: NavController, public navParams: NavParams, public loadingCtrl: LoadingController, public toastCtrl: ToastController, public storage: Storage ) { super(); } ionViewDidLoad() { this.storage.get('token').then((val)=>{ if(val !== null){ this.id = this.navParams.get('id'); let loading = this.showLoading(this.loadingCtrl,"Loading data..."); //获取问题的详情 setTimeout(()=>{ this.question = { "ContentTitle":"你今天真好看-正在直播", "Content":"占位,用于播放直播内容...", "watchNumber":103, "likeNumber":26 }; this.answers = [ {"headFace":"../../assets/imgs/avatar.jpg","userNickname":"Jerry","content":"特别好使,666","createDateTime":"2018.12.19"}, {"headFace":"../../assets/imgs/logo.png","userNickname":"Tom","content":"特别好使,666","createDateTime":"2018.12.09"}, {"headFace":"../../assets/imgs/avatar.jpg","userNickname":"Simon","content":"特别好使,666","createDateTime":"2018.12.11"}, {"headFace":"../../assets/imgs/logo.png","userNickname":"Gavin","content":"特别好使,666","createDateTime":"2018.12.13"}, {"headFace":"../../assets/imgs/avatar.jpg","userNickname":"Anothey","content":"特别好使,666","createDateTime":"2018.12.15"}, {"headFace":"../../assets/imgs/logo.png","userNickname":"Meina","content":"特别好使,666","createDateTime":"2018.12.14"}, {"headFace":"../../assets/imgs/avatar.jpg","userNickname":"Toby","content":"特别好使,666","createDateTime":"2018.12.12"}, ]; this.isFavourite = false; this.isMyQuestion = true; loading.dismiss(); },200); } }); } //click favourite saveFavourite() { let loading = this.showLoading(this.loadingCtrl,'Loading...'); setTimeout(()=>{ this.showToast(this.toastCtrl,this.isFavourite?'取消关注成功':'关注成功'); this.isFavourite = !this.isFavourite; loading.dismiss(); },2000) } }
五.问题回答页面的布局开发
1.开发思路
- 使用
ionic g page answer
创建page页面 - 编写回答页面内容(ts和html)
- 使用技巧
- 使用modal传递过来的参数时,使用
navParams.get('参数名');
- 使用
modal.onDidDismiss(()=>{},1000)
获取modal返回时触发的监听事件
- 使用modal传递过来的参数时,使用
2.实例代码
-
detail.ts添加代码
//show answer page showAnswerPage() { let modal = this.modalCtrl.create(AnswerPage,{"id":this.id}); //当modal关闭时的回调 modal.onDidDismiss(()=>{ let loading = this.showLoading(this.loadingCtrl,"Loading data..."); //获取问题的详情 setTimeout(()=>{ this.question = { "ContentTitle":"你今天真好看-正在直播", "Content":"占位,用于播放直播内容...", "watchNumber":103, "likeNumber":26 }; this.answers = [ {"headFace":"../../assets/imgs/logo.png","userNickname":"Jack","content":"赞的一匹","createDateTime":"2018.12.20"}, {"headFace":"../../assets/imgs/avatar.jpg","userNickname":"Jerry","content":"特别好使,666","createDateTime":"2018.12.19"}, {"headFace":"../../assets/imgs/logo.png","userNickname":"Tom","content":"特别好使,666","createDateTime":"2018.12.09"}, {"headFace":"../../assets/imgs/avatar.jpg","userNickname":"Simon","content":"特别好使,666","createDateTime":"2018.12.11"}, {"headFace":"../../assets/imgs/logo.png","userNickname":"Gavin","content":"特别好使,666","createDateTime":"2018.12.13"}, {"headFace":"../../assets/imgs/avatar.jpg","userNickname":"Anothey","content":"特别好使,666","createDateTime":"2018.12.15"}, {"headFace":"../../assets/imgs/logo.png","userNickname":"Meina","content":"特别好使,666","createDateTime":"2018.12.14"}, {"headFace":"../../assets/imgs/avatar.jpg","userNickname":"Toby","content":"特别好使,666","createDateTime":"2018.12.12"}, ]; this.isFavourite = false; this.isMyQuestion = true; loading.dismiss(); },200); }) modal.present(); }
-
answer.html
<ion-header> <ion-navbar> <ion-title>Answer</ion-title> <ion-buttons start> <button ion-button (click)="dismiss();"> <span ion-text color="primary" showWhen="ios">取消</span> <ion-icon name="md-close" showWhen="android"></ion-icon> </button> </ion-buttons> <ion-buttons end> <button ion-button (click)="submit()"> <span ion-text color="primary" showWhen="ios">发布</span> <ion-icon name="md-add-circle" showWhen="android"></ion-icon> </button> </ion-buttons> </ion-navbar> </ion-header> <ion-content> <ion-list> <ion-item> <ion-label stacked>请输入回答内容</ion-label> <ion-textarea type="text" rows="20" style="height:100px;" [(ngModel)]="content"></ion-textarea> </ion-item> </ion-list> </ion-content>
-
answer.ts
import { Component } from '@angular/core'; import { IonicPage, NavController, NavParams, ViewController, LoadingController, ToastController } from 'ionic-angular'; import { BaseUI } from '../../common/baseUI'; import {Storage} from '@ionic/storage'; @Component({ selector: 'page-answer', templateUrl: 'answer.html', }) export class AnswerPage extends BaseUI{ id:string; content:string; constructor( public navCtrl: NavController, public navParams: NavParams, public viewCtrl: ViewController, public storage: Storage, public loadingCtrl: LoadingController, public toastCtrl: ToastController ) { super(); //modal接受传递的参数 this.id = navParams.get('id'); } //dismiss modal dismiss() { this.viewCtrl.dismiss(); } //submit info submit() { this.storage.get('token').then((val)=>{ if(val!==null){ let loading = this.showLoading(this.loadingCtrl,'Loading...'); setTimeout(()=>{ this.showToast(this.toastCtrl,'Submit successful!'); loading.dismiss(); this.viewCtrl.dismiss(); },1000) } }) } }