【问题标题】:How to set default selected value of ion-option?如何设置离子选项的默认选择值?
【发布时间】:2017-04-30 00:06:33
【问题描述】:

我使用的是 Ionic v2,显示页面时无法设置所选值。

<ion-select [(ngModel)]="company.form">
    <ion-option *ngFor="let form of forms" [value]="form" [selected]="true">{{form.name}}</ion-option>
</ion-select>

我也尝试过checked,但这也不起作用。我怎样才能做到这一点?

Cordova CLI: 6.4.0
Ionic Framework Version: 2.0.0-rc.3
Ionic CLI Version: 2.1.13
Ionic App Lib Version: 2.1.7
Ionic App Scripts Version: 0.0.45

【问题讨论】:

  • 试试这个:this.company.form = this.forms[0] 在你的component.ts

标签: html angular ionic-framework ionic2


【解决方案1】:

如果您处理默认值 xor 对象,最简洁的方法是为 [compareWith] 属性提供比较函数。此函数在参数中接受 2 个对象,如果它们相等则返回 true。这样,模型中的现有值将在开始时被选择。如果在选择之外的模型中添加新数据,这也有效。

以下示例取自官方 Ionic 文档

<ion-item>
  <ion-label>Employee</ion-label>
  <ion-select [(ngModel)]="employee" [compareWith]="compareFn">
    <ion-option *ngFor="let employee of employees" [value]="employee"></ion-option>
  </ion-select>
</ion-item>

compareFn(e1: Employee, e2: Employee): boolean {
  return e1 && e2 ? e1.id == e2.id : e1 == e2;
}

编辑:使用双等号使其适用于 Ionic 4(正如 Stan Kurdziel 在评论中建议的那样)

【讨论】:

  • 我认为这应该是公认的答案。它更干净、更直接,而且是官方的 ionic 建议 - ionicframework.com/docs/api/components/select/Select/…
  • 谢谢!在 Ionic 3 中没有 [compareWith] 的情况下,绑定对我来说很好(甚至不使用对象,只是值的数字),但在 Ionic 4 中退出工作...添加 compareWith AND 仅使用双等号而不是三等号固定 Ionic 4我。
  • 这在新版本的 ionic 中不起作用。所选值的任何更改都不会反映。
  • @invot 用 double 替换三等号,因为 Ionic 4 混合字符串和 int 值
【解决方案2】:

问题似乎是 ion-option 不喜欢 rc3 中的对象。我必须只使用对象的 id 部分并编写一个单独的 changehandler 来找到所需的对象并将其设置为一个值。

  <ion-select [ngModel]="company.form.id" (ngModelChange)="companyFormSelected($event)" okText="Ok" cancelText="Mégsem">
    <ion-option *ngFor="let form of forms" [value]="form.id" [selected]="form.id == company.form.id">{{form.name}}</ion-option>
  </ion-select>

还有变更处理程序:

companyFormSelected(newform) {
    let selectedForm = this.forms.find((f)=>{
      return f.id === newform;
    });
    this.company.form=selectedForm;
}

这似乎是 rc3 中的一个错误,但我不知道在哪里可以报告错误。我确实打开了topic on ionic forum

【讨论】:

    【解决方案3】:
    <ion-select [(ngModel)]="name">// binding the value available from ts file
        <ion-option *ngFor="let form of forms; let idx = index" [value]="form.name"  selected="{{(idx==0).toString()}}">{{form.name}}</ion-option>
    </ion-select>
    

    在你的 ts 文件中

    name = this.forms[0].name //assign the variable name to the first index of your array
    

    【讨论】:

    • 这行得通吗?看来您现在正在将 select 上的 ngModel 绑定到一个字符串,但选项值都是对象。
    • 好吧,至少它表明了rc3中的这个ion-option的东西实际上可以显示一个默认值。但是,解决方案是不要在其中使用对象,也不必涉及索引。感谢您的时间@MohanGopi
    【解决方案4】:

    这对我有用。

    在 html 中:

    <ion-select [(ngModel)]="company.form">
        <ion-option value="frm1"> Form 1 </ion-option>
        <ion-option value="frm2"> Form 2 </ion-option>
    </ion-select>
    

    在 ts 中:

    company = {
       form:null
    }; 
    
    constructor(){
       this.company.form = "frm1";
    }
    

    【讨论】:

    • 是的,这行得通,但是如果选择的是对象呢?
    【解决方案5】:
    <ion-select ([ngModel])="dropdown1">
      <ion-select-option value="1">Item1</ion-select-option>
      <ion-select-option value="2">Item2</ion-select-option>
    </ion-select>
    

    以下将不起作用:

    dropdown1 = 2;
    

    但以下方法会起作用:

    dropdown1 = 2 + "";
    

    选择选项值被视为字符串,因此您应该将字符串值分配给模型变量,以便比较不会失败。

    【讨论】:

    • 今天,在所有其他建议都失败后,这解决了我的麻烦......!
    【解决方案6】:

    您不需要使用属性 selected 或 [selected] 没有必要

    <ion-select [(ngModel)]="company.form.id" name="company.form.id">
        <ion-option *ngFor="let form of forms" value="{{ form.id }}">
          {{ form.name }}
        </ion-option>
    </ion-select>
    

    【讨论】:

    • 据我所知,这是 ionic v2 rc-3 中的一个错误,并已在最终版本中修复。我想你的解决方案现在正在运行,看起来它应该工作的方式,我的解决方案是 rc-3 中错误的解决方法。因此,为了将来参考,我将您的答案设置为原始问题的最佳解决方案。感谢您的回答!
    • 如果我初始化 company.form.id=2,它不应该在视觉上显示该选项被选中?它没有发生,不知道为什么......
    【解决方案7】:

    在ion-option里面,你可以做

    <ion-option [attr.selected]="(form.name == name) ? true : null"> {{ form.name }} </ion-option>
    

    【讨论】:

    • 没用。也尝试使用 [attr.checked],但也没有用。你是否使用相同的离子版本,这对你有用吗?
    【解决方案8】:
      in html---->
    
         <ion-item text-center >
            <ion-select  [(ngModel)]="selectedQuestion" placeholder="Choose Security Question" >
              <ion-option *ngFor="let q of questionArray let i=index"  selected="{{(i==defaultSelectQuestion).toString()}}"  >
                 {{q}}
                </ion-option>
            </ion-select>
          </ion-item>
    
    
    in ts---->
    //if u dont want any default selection
        this.defaultSelectQuestion = -1; 
    
    //if first element should be your default selection
      this.defaultSelectQuestion = 0;
    
    
    
    this.selectedQuestion=this.questionArray[this.defaultSelectQuestion]
    

    【讨论】:

      【解决方案9】:

      长话短说,并引用 ionic 文档(始终参考原始来源): “选择应该与子元素一起使用。如果没有为子元素赋予 value 属性,则其 text 将用作 value。 如果在 上设置了 value,则将根据该 value 选择所选选项。"

      ...因此....确保您的 ionic-selectionic-select-option 上的 value 属性引用相同javascript object.attribute 在您的代码中...基本上指向同一事物..请参阅下面的 ionic-select 和数组级别值中的页面级别属性 value="{{ country.id }}" ="{{c.id}}" 离子选择选项

      请注意,ngModel 不再管理页面级别的国家 属性生命周期

          <ion-item>
              <ion-select *ngIf="countries.length > 0"
                           (ionChange)="onCountryChaged($event)"
                           interface="popover"
                            clearInput="true"
                            placeholder='Country (required)'
                             value="{{ country.id }}">
                  <ion-select-option lines="none"
                    *ngFor="let c of countries"
                     value="{{ c.id }}"> {{ c.label }}
                  </ion-select-option>
              </ion-select>
           </ion-item>
              
              
      Inside the .ts file we can now set *country* member programmatically
      Page:constructor();
          this.platform.ready().then(async () => {
              this.getCountries(); //load list of countries from provider
              this.country = this.navDataService.getCountry();//local data store to save state between pages
              }).catch(error => { });
              
      Page:EventHandler onCountryChaged(event): void {
           
          let id = event.detail.value;
          this.country = this.countries.find( item => item.id == id ) ;
          this.navDataService.setCountry(this.country);
      }
                  
           
      

      【讨论】:

      • 有点希望我能多次支持这个答案,因为它提供的洞察力。关于确保 ion-select 和 ion-select-option 中的值匹配的提示刚刚保存了我当前的分支。
      猜你喜欢
      • 2018-07-20
      • 2019-04-29
      • 2019-09-18
      • 2019-06-13
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      相关资源
      最近更新 更多