Ионный сегмент меняется только после нажатия на ввод контента

Я создаю приложение для редактирования фотографий, используя ionicv2 и Adobe Creative SDK. Я успешно внедрил Creative SDK.

После того, как CSDK успешно возвращает URL-адрес отредактированного файла, я отправляю страницу, содержащую сегмент, вместе с URL-адресом файла.

Проблема на второй странице, когда нажимаю на сегмент, он не переключается. Он будет переключаться только в том случае, если я нажму на ввод внутри страницы.

Я попытался сделать это без CSDK, и он работает без проблем.

Мой код:

loadCamera(sourceType){

    const options: CameraOptions = {
      quality: 100,
      destinationType: this.camera.DestinationType.DATA_URL,
      encodingType: this.camera.EncodingType.JPEG,
      mediaType: this.camera.MediaType.PICTURE,
      sourceType: sourceType
    }

    this.camera.getPicture(options).then((imageData) => {

      // imageData is either a base64 encoded string or a file URI
      // If it's base64:
      let base64Image = 'data:image/jpeg;base64,' + imageData;

      var thisModule = this;

      function success(newUrl) {
          console.log("Success Editing!", newUrl);
          thisModule.goToCreate(newUrl);
      }

      function error(error) {
          console.log("Error!", error);
      }

      /* Optional `options` object. See API guide for usage. */
      var options = {
           outputType: CSDKImageEditor.OutputType.JPEG, 
           quality: 70
      };

      /* Launch the Image Editor */
      CSDKImageEditor.edit(success, error, base64Image, options);
    }, (err) => {
    // Handle error
    });

  }

  /* Push a new page along with url */
  goToCreate(url){
    this.nav.push(SecondPage, {url: url});
  }

}

Вторая страница (содержит компонент сегмента)

section: string;
url: string;

  constructor(...) {
    this.url = navParams.get('url');
    console.log(this.url); //Working Perfectly

    this.section = "segment1";
  }

  onSegmentChanged(segmentButton: SegmentButton) {
    // console.log('Segment changed to', segmentButton.value);
  }

  onSegmentSelected(segmentButton: SegmentButton) {
    // console.log('Segment selected', segmentButton.value);
  }

HTML-код второй страницы (Когда я нажимаю на сегмент 2, он не переходит туда, пока я не нажму на ввод внутри сегмента 1)

<ion-content class="secondpage-content">
  <ion-segment class="secondpage-segment" [(ngModel)]="section" (ionChange)="onSegmentChanged($event)">
    <ion-segment-button value="segment1" (ionSelect)="onSegmentSelected($event)">
      Segment 1
    </ion-segment-button>
    <ion-segment-button value="segment2" (ionSelect)="onSegmentSelected($event)">
      Segment 2
    </ion-segment-button>
    <ion-segment-button value="segment3" (ionSelect)="onSegmentSelected($event)">
      Segment 3
    </ion-segment-button>
  </ion-segment>
  <div [ngSwitch]="section">
    <div *ngSwitchCase="'segment1'" >
      <ion-item>
        <ion-label floating>Input</ion-label>
        <ion-input type="text" formControlName="input_example"></ion-input>
      </ion-item>
    </div>
    <div *ngSwitchCase="'segment2'" >
    </div>
    <div *ngSwitchCase="'segment3'" >
    </div>
  </div>
</ion-content>

Кроме того, журналы консоли не возвращают никаких ошибок. У вас есть идеи о том, что происходит? Я действительно думаю, что это связано с CSDK. Спасибо


person Redzwan Latif    schedule 26.07.2017    source источник
comment
Ваш console.log("Success Editing!", newUrl); сгорел?   -  person Duannx    schedule 01.08.2017


Ответы (3)


Я столкнулся с такой же проблемой с сегментом. Способ, которым я справился с этим, был:

import { Component, ViewChild } from '@angular/core';
import { IonicPage, NavController, NavParams, Segment, ModalController } from 'ionic-angular';

section: string;
url: string;
@ViewChild(Segment)
private segment: Segment;
constructor(...) {
    this.url = navParams.get('url');
    console.log(this.url); //Working Perfectly

    this.section = "segment1";
    setTimeout(() => {
        if (this.segment) {
            this.segment.ngAfterContentInit();
            this.segment._inputUpdated();
            this.onSegmentChanged(null)
        }
    });
}

onSegmentChanged(segmentButton: SegmentButton) {
    // console.log('Segment changed to', segmentButton.value);
}

onSegmentSelected(segmentButton: SegmentButton) {
    // console.log('Segment selected', segmentButton.value);
}
person Aman    schedule 31.07.2017
comment
привет, у меня такая же проблема. к сожалению, ваше исправление не работает для меня. я получаю доступ к странице сегмента из прослушивателя событий карты Google. google.maps.event.addListenerOnce(infoWindow, 'domready', () =› { document.getElementById(divid).parentNode.parentNode.parentNode.parentNode.addEventListener('click', this.goConstruction(element.id), { пассивный: истина}); }); goConstruction(id) { return (event) =› { this.navCtrl.push('ConstructionSegmentPage', {id: id}) } } - person markus; 03.06.2018

У меня такая же проблема. У меня раньше не было такой проблемы на другой моей работе, но по какой-то неизвестной причине это просто происходит.

    this.segment.ngAfterContentInit();

тоже не поможет.

И я нашел это решение работает для меня.

  1. добавить дескриптор события ionChange в html

    <ion-segment [(ngModel)]="cat" (ionChange)=onSegmentChanged($event)>
    
  2. Добавить модуль ChangeDetectorRef и обработчик событий в ts

    import { ChangeDetectorRef } from '@angular/core';        
    ...
    export class xxxPage {
    ...
    constructor(
     private cf: ChangeDetectorRef,
    ...
    }
    ...
    onSegmentChanged(obj)
    {        
      this.cf.detectChanges();
    } 
    }
    
person Gormit    schedule 16.06.2018

В моем случае, после того как я добавил ChangeDetectorRef вместе с NgZone, он все еще не работал, пока я не добавил ngModel в ионный сегмент, на который я ссылался ngSwitch.

person Zack    schedule 22.01.2021