Ionic 3- 可能从组件触发 IonChange 事件?

Posted

技术标签:

【中文标题】Ionic 3- 可能从组件触发 IonChange 事件?【英文标题】:Ionic 3- Possible to trigger an IonChange event from component? 【发布时间】:2019-07-18 19:50:27 【问题描述】:

简而言之,我正在开发一个具有多种形式的应用程序。在大多数情况下,如果用户从通常的 Confirmation 视图返回,他们看到他们将数据(以防他们想要 omdify)放回表单,表单应该保留该数据。

我为此使用了反应形式,而且在大多数情况下,它都有效。 在组件初始化时,我检查表单是否通过从 Confirmation 组件触发的 EventEmitter 接收到一些信息:

   ngOnInit() 
    if (this.cardData) 
      this.retrievedFormData = 
    amount: this.cardData.card.amount.amount,
    card: 
      number: this.cardData.card.number,
      trade: this.cardData.card.trade,
      type: this.cardData.card.type,
      cardId: this.cardData.cardId,
    ,
    
    this.initForm();
  

initForm() 初始化响应式表单,并且每个参数检查组件是否接收到存储为检索的FormData 对象的先前数据。示例:

    this.formGroup = this.formBuilder.group(
      amount: [(this.retrievedFormData ? this.retrievedFormData.amount : null),
        [Validators.required, Validators.min(0.01), Validators.pattern(amountRegex)]],
)

这样,如果表单接收到数据,参数可以很容易地自行“自动填充”。

整个应用程序中只有一个项目不能很好地自动填充。我有一个离子选择,其中包含通常的 *ngFor 选项。每个选项都是一个包含 4 个参数的对象。

html:

  <ion-select name="card" formControlName="card" okText=" 'COMMON.OK' | translate " cancelText=" 'COMMON.CANCEL' | translate "(ionChange)="handleCardSelection($event)" >
    <ion-option *ngFor="let card of cards" [value]="card">card.number - card.type</ion-option>
  </ion-select>

'card' 被初始化为一个 AbstractControl,并且该对象有 4 个参数,用户在下拉列表中看到两个参数,即卡号和类型(信用卡/借记卡)。所有的参数都通过 ion-select 中的 ionChange 存储,它调用组件中的一个名为 handleCardSelection() 的方法,该方法存储对象的参数:

  handleCardSelection(card) 
        this.chosenCardData = 
          cardId: card.id,
          type: card.type,
          trade: card.trade,
          number: card.number
        ;
    

在提交数据并将其发送到 Confirmation 视图的计时器到时,一切正常且花花公子。但是,当我尝试返回时,我的 ion-select 没有预加载它收到的信息(并且我已经测试了几次 Form 确实将其所有信息取回,因此确实出现了卡片对象)。

就像上面关于卡金额的示例一样,我正在尝试让组件检查它是否收到了“卡”对象:

  card: [(this.retrievedFormData ? this.retrievedFormData.card : null),
      Validators.required],

在下面,反映了我分配给离子选择的 formControlName:

this.cardFC = this.formGroup.get('card');

但无论我尝试什么,离子选择都不会自动选择与其收到的信息相匹配的选项。

所以在这一切之后,我的问题如下:

(ionChange) 似乎是设置选项本身的事件。

<ion-select name="card" formControlName="card" (ionChange)="handleCardSelection($event)">

因为 (ionChange) 似乎只能由手动输入触发,如果组件检测到它已收到信息,我想自动激活它...有没有办法从组件触发 ionChange本身?这样,在检查先前信息并存储它的同一个 ngOnInit 期间,我可以触发事件以预先选择与接收到的数据匹配的卡。

编辑:由于 Suraj 提到了它(这不是一个坏方法),我确实尝试从 ngOnInit 调用 handleCardSelection(),但它没有任何效果。

【问题讨论】:

为什么不直接在if(cardaData) 中调用handleCardSelection(retrievedFormData.card) 我试过@SurajRao,但离子选择从未自动填充。感到羞耻,因为这是一个非常直观的可能解决方案 您如何设置cards 选项?如果卡片是异步接收的,则可能在您设置选择时列表未填充 它本质上是一个初始化为空的数组,构造函数调用 getCardsList() 之类的方法来检索数据块,每个对象都是具有这些参数的特定卡片。然后,该数据块被存储在数组中,允许我执行“让卡片卡片” 所以当反应形式设置选择时它是空的?当时是空的吗?您可能需要在获取离子选择选项列表之后初始化表单 【参考方案1】:

这与ionChange 和触发它无关。

ion-select 设置从选项列表中预选的卡片。它似乎检查了参考retrievedFormData.card 是与卡片列表不同的对象。

您必须像这样从选项中获取参考:

let selectedCard = this.cards.find((c)=>c.id==this.retrievedFormData.card.id);

然后在initform中设置:

card: [(selectedCard ? selectedCard : null),
  Validators.required],

【讨论】:

以上是关于Ionic 3- 可能从组件触发 IonChange 事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Ionic5 代码触发后退按钮

另一个组件 Ionic 4 中的组件

使用 ionic 动态添加组件

onIonChange 在 Ionic 5 React 上触发多个输入

本地通知中的属性“触发器”不适用于 ionic 3

ionic 上拉刷新为啥自动触发