Ionic 2 - 如果没有互联网 + 有效表单,我如何禁用按钮

Posted

技术标签:

【中文标题】Ionic 2 - 如果没有互联网 + 有效表单,我如何禁用按钮【英文标题】:Ionic 2 - How can I disable a button if there's no internet + valid form 【发布时间】:2017-04-28 00:03:11 【问题描述】:

我正在尝试使用 Ionic 2 + Angular 2 构建一个表单。这个表单是模型驱动的表单类型,所有验证都是使用验证器进行的。另外,还有两个 Observable 可以检查是否有互联网连接。

我还没有找到在没有互联网连接且表单无效时禁用提交按钮的方法。我怎样才能让这两个东西一起工作?

到目前为止,代码是这样的:

survey.html

 <ion-header class="main-header">
  <ion-navbar>
    <button ion-button menuToggle>
      <ion-icon name="menu"></ion-icon>
    </button>
    <ion-title>Questionário</ion-title>
  </ion-navbar>
</ion-header>

<ion-content padding>
  <form [formGroup]="form" (ngSubmit)="onSubmit()" class="form-bg" novalidate>
    <div class="form-content">
      <h5>1. Perfil do Fazendeiro</h5>
      <div class="question">
        <p><strong>1.1</strong> Em que perfil você se qualifica?</p>
        <ion-list radio-group formControlName="isPropertyOwner">
          <ion-item>
            <ion-label><small>Proprietário do terreno</small></ion-label>
            <ion-radio value="owner"></ion-radio>
          </ion-item>
          <ion-item>
            <ion-label><small>O terreno é arrendado</small></ion-label>
            <ion-radio value="lease"></ion-radio>
          </ion-item>
          <ion-item>
            <ion-label><small>Outro</small></ion-label>
            <ion-radio value="other"></ion-radio>
          </ion-item>
        </ion-list>
      </div>
    <br>
    <button ion-button type="submit" block [disabled]="enableBtn()">Enviar</button>
    </div>
  </form>
</ion-content>

survey.ts

import  Component  from '@angular/core';
import  Validators, FormBuilder, FormGroup, FormControl  from '@angular/forms';
import  NavController, NavParams  from 'ionic-angular';
import  Observable  from 'rxjs/Observable';
import 'rxjs/add/observable/fromEvent';

@Component(
  selector: 'page-survey',
  templateUrl: 'survey.html'
)

export class Survey 

  form: FormGroup;

  constructor(public alerCtrl: AlertController, public navCtrl: NavController,public toastCtrl: ToastController, public navParams: NavParams, public formBuilder: FormBuilder) 

    this.form = formBuilder.group(
      "isPropertyOwner": ["", Validators.required]

    );

    /* Check if it's online/offline */
    var offline = Observable.fromEvent(document, "offline");
    var online = Observable.fromEvent(document, "online");
    var status;

    offline.subscribe(() => 
      status = false;
    );

    online.subscribe(() => 
        status = true;
    );
  

  enableBtn() 
    if (this.form.valid && status) 
      return true
    
    else return false;
  

  onSubmit() 
    console.log("model-based form submitted");
    console.log(this.form);
  

提前致谢:)

【问题讨论】:

【参考方案1】:

您可能需要plugin 来查看您是否在线/离线。实际上它在ionic native。

import  Network  from 'ionic-native';

let disconnectSubscription = Network.onDisconnect().subscribe(() => 
  this.status = false;
);

let connectSubscription = Network.onConnect().subscribe(() => 
  this.status = true;
);

从您的代码中可以看出您正在使用 var status; 这意味着该属性是私有的。所以你应该在类范围内定义状态以在模板中可见

【讨论】:

非常感谢 Volodymyr,这样可以更轻松地检查是否有网络连接。但是,有没有办法将此事件更改器与表单验证本身相关联?我只是想不出办法做到这一点:( @CaikeMotta 您遇到的问题是您的状态仅在构造函数中可见。在类范围内定义它,就像你在表单中所做的那样 我修复了它,正如你提到的那样在类范围内定义它。虽然我必须做一些其他事情才能使我的逻辑按预期工作:&lt;button ion-button type="submit" block [disabled]="!this.form.valid || hasConnection()"&gt;Send&lt;/button&gt; 现在它检查表单验证和连接,所以我不得不用 || 替换 &&反而。感谢您的帮助,我很感激! :)

以上是关于Ionic 2 - 如果没有互联网 + 有效表单,我如何禁用按钮的主要内容,如果未能解决你的问题,请参考以下文章

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

如果没有输入,如何调用表单有效性事件

表单验证不适用于 Ionic 2 中的 Angular 2 FormBuilder

Ionic 3表单仍然警告我:“密码字段不包含在表单中”

什么是管理 vb 表单的有效方法,该表单以 access 2013 作为数据库来处理大量数据(远高于 2 gb)?

在 ionic 中重用表单的输入