账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    angular2(ionic2):在ios中,某个懒加载页面上的所有click事件不触发变化检测?
    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
    打赏
    收藏
    点击回答
        全部回答
    • 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秒。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部