- 83
- 0
最近在运用ionic2的开发中,遇到了一个“奇怪”的事情:某个页面中,有用click事件来改变页面元素中的a标签的active(一个class)来控制元素是否选中。在浏览器和android实机中工作正常,可是到了ios实机中,a标签不会变化。debug发现在ios上click事件中的所有代码都执行了,但是页面没有刷新。于是在每个click的事件代码的最后加上this.changeDetectorRef.detectChanges(),手动让这个页面执行变化检测,问题解决。但问题是,按照angular2的特性,所有的click事件都应该会自动触发整个组件树的变化检测,为什么这个页面在ios中失效了,有哪位大神知道原因吗?
完整代码:
1.setting.module.ts:
import { NgModule } from '@angular/core';
import { IonicPageModule } from 'ionic-angular';
import {SettingPage} from "./setting";
import {SharedModule} from "../../../../../app/shared.module";
@NgModule({
declarations: [
SettingPage
],
imports: [
IonicPageModule.forChild(SettingPage),SharedModule
],
})
export class SettingModule {}
2.setting.ts
import {ChangeDetectorRef, Component, OnInit} from '@angular/core';
import {IonicPage, NavController, NavParams} from 'ionic-angular';
import {AlertService} from "../../../../../service/alert.service";
import {AppHttp} from "../../../../../service/app-http.service";
import {SettingService} from "./setting.service";
@IonicPage()
@Component({
selector: 'setting',
templateUrl: 'setting.html'
})
export class SettingPage{
constructor(public settingService: SettingService,public navCtrl: NavController,public navParams: NavParams,public http:AppHttp ,public alertService:AlertService,public cd:ChangeDetectorRef) {
}
ionViewDidLoad(){
}
ionViewWillEnter(){
}
chooseOddsType(type){
if(this.settingService.setting.settingJson.oddsType!=type){
this.settingService.setting.settingJson.oddsType=type;
}
//this.cd.detectChanges();不加这行在iOS中就有问题
}
chooseGoalTip(type){
if(!this.settingService.setting.settingJson.goalTip){
this.settingService.setting.settingJson.goalTip=[];
}
for (let j = 0; j < this.settingService.setting.settingJson.goalTip.length; j++) {
if (type ==this.settingService.setting.settingJson.goalTip[j]) {
this.settingService.setting.settingJson.goalTip.splice(j,1);
this.cd.detectChanges();
return;
}
}
this.settingService.setting.settingJson.goalTip.push(type);
//this.cd.detectChanges();不加这行在iOS中就有问题
}
chooseRedCardTip(type){
if(!this.settingService.setting.settingJson.redCardTip){
this.settingService.setting.settingJson.redCardTip=[];
}
for (let j = 0; j < this.settingService.setting.settingJson.redCardTip.length; j++) {
if (type ==this.settingService.setting.settingJson.redCardTip[j]) {
this.settingService.setting.settingJson.redCardTip.splice(j,1);
//this.cd.detectChanges();不加这行在iOS中就有问题
return;
}
}
this.settingService.setting.settingJson.redCardTip.push(type);
//this.cd.detectChanges();不加这行在iOS中就有问题
}
isRedCardTipActive(type){
for(let i=0;i<this.settingService.setting.settingJson.redCardTip.length;i++){
if(this.settingService.setting.settingJson.redCardTip[i]==type){
return true;
}
}
return false;
}
isGoalTipActive(type){
for(let i=0;i<this.settingService.setting.settingJson.goalTip.length;i++){
if(this.settingService.setting.settingJson.goalTip[i]==type){
return true;
}
}
return false;
}
}
3.setting.html:
<ion-header>
<div class="navBar no_bg">
<div class="topBar">
<a class="back_icon_white" href="javascript:;" navPop></a>
<div class="titleBar">设置</div>
</div>
</div>
</ion-header>
<ion-content class="bg_242b45">
<div class="pt10 pl10 pr10 pb60">
<!--提示设置-->
<div class="whiteBlock">
<div class="title40">提示设置</div>
<ul class="setUpList">
<li class="hasLink" tappable (click)="goToProvider()">赔率公司 <span class="righthTxt pr15">{{settingService.setting.settingJson?.provider?.description}}</span></li>
<li>数据类型
<div class="setUpSetLectBtn">
<a href="javascript:;" [ngClass]="{active:settingService.setting.settingJson.oddsType==1}" tappable (click)="chooseOddsType(1)">欧赔</a>
<a href="javascript:;" [ngClass]="{active:settingService.setting.settingJson.oddsType==2}" tappable (click)="chooseOddsType(2)" >亚盘</a>
<a href="javascript:;" [ngClass]="{active:settingService.setting.settingJson.oddsType==3}" tappable (click)="chooseOddsType(3)">大小球</a>
</div>
</li>
<li>进球提示
<div class="setUpSetLectBtn">
<a href="javascript:;" [ngClass]="{active:isGoalTipActive(1)}" tappable (click)="chooseGoalTip(1)">声音</a>
<a href="javascript:;" [ngClass]="{active:isGoalTipActive(2)}" tappable (click)="chooseGoalTip(2)">震动</a>
<a href="javascript:;" [ngClass]="{active:isGoalTipActive(3)}" tappable (click)="chooseGoalTip(3)">弹窗</a>
</div>
</li>
<li>红牌提示
<div class="setUpSetLectBtn">
<a href="javascript:;" [ngClass]="{active:isRedCardTipActive(1)}" tappable (click)="chooseRedCardTip(1)">声音</a>
<a href="javascript:;" [ngClass]="{active:isRedCardTipActive(2)}" tappable (click)="chooseRedCardTip(2)">震动</a>
<a href="javascript:;" [ngClass]="{active:isRedCardTipActive(3)}" tappable (click)="chooseRedCardTip(3)">弹窗</a>
</div>
</li>
<li>仅提示关注的(进球提示与红牌提示)
<div class="setUpswitch" [ngClass]="{active:settingService.setting.settingJson.tipForFocusMatchesOnly}"
tappable (click)="settingService.setting.settingJson.tipForFocusMatchesOnly=!settingService.setting.settingJson.tipForFocusMatchesOnly;cd.detectChanges();"><i></i></div>
</li>
<li>排名显示
<div class="setUpswitch" [ngClass]="{active:settingService.setting.settingJson.showRank}"
tappable (click)="settingService.setting.settingJson.showRank=!settingService.setting.settingJson.showRank;cd.detectChanges();"><i></i></div>
</li>
</ul>
</div>
</div>
</ion-content>
- 共 0 条
- 全部回答
-
原來無話可說 普通会员 1楼
在Angular2中,当你在iOS中使用Angular 2的ionic2时,如果你希望在页面加载后对所有点击事件进行检测,可以使用
ngAfterViewInit()函数。但是,这并不总是可以的。如果你的页面已经加载,Angular2可能会错过点击事件的检测。例如,如果你有一个点击按钮的组件,你可以这样使用
ngAfterViewInit():```typescript import { Component, ViewChild } from '@angular/core';
@Component({ selector: 'app-button', templateUrl: './button.component.html', styleUrls: ['./button.component.css'] }) export class ButtonComponent { @ViewChild('myButton') myButton: ElementRef;
ngAfterViewInit() { console.log('Button is rendered!'); } } ```
然而,如果你只是想在页面加载后对点击事件进行检测,那么你可能需要使用
ngAfterViewInit()。这将确保在页面加载后立即调用ngAfterViewInit()函数,因此你可以在页面加载后立即检测点击事件。但是,这并不是一个通用的方法,因为
ngAfterViewInit()通常在Angular2运行时(在DOM元素创建后)才会被调用。因此,你可能需要在你的页面组件中添加一个异步处理函数,以在页面加载后立即触发ngAfterViewInit()函数。这通常可以通过使用setTimeout()函数实现。例如,你可以这样使用
ngAfterViewInit():```typescript import { Component, ViewChild } from '@angular/core';
@Component({ selector: 'app-button', templateUrl: './button.component.html', styleUrls: ['./button.component.css'] }) export class ButtonComponent { @ViewChild('myButton') myButton: ElementRef;
constructor() {}
ngAfterViewInit() { console.log('Button is rendered!'); setTimeout(() => { console.log('Button was clicked!'); }, 1000); } } ```
在这个例子中,
ngAfterViewInit()将在页面加载后1秒被调用,这意味着当你点击按钮时,它将被触发两次,一次在页面加载后立即,一次在页面加载后1秒。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
