I wanted to create 2 list of ion-item, like this:
<ion-list>
<ion-item>
<ion-label>Gaming</ion-label>
<ion-select [(ngModel)]="gaming">
<ion-option value="nes">NES</ion-option>
<ion-option value="n64">Nintendo64</ion-option>
<ion-option value="ps">PlayStation</ion-option>
</ion-select>
</ion-item>
</ion-list>
but my question is, is it possible that I want the ion-option to be in a list of arrays so that the 2nd list of item will only show ion-option that are not selected from the 1st one.
e.g.: 1st list NES where selected so the 2nd list will only show Nintendo64 and PlayStation
Hi, @EzzatLiao
<ion-list>
<ion-item>
<ion-label>Gaming</ion-label>
<ion-select [(ngModel)]="gaming1" (ionChange)='valuechange(gaming1)'>
<ion-option *ngFor="let item of allList" [value]="item.values">{{item.name}}</ion-option>
</ion-select>
</ion-item>
<ion-item>
<ion-label>Gaming</ion-label>
<ion-select [(ngModel)]="gaming2">
<ng-container *ngFor="let item of allList">
<ion-option [value]="item.values" *ngIf="item.flag==0">{{item.name}}</ion-option>
</ng-container>
</ion-select>
</ion-item>
</ion-list>
Component:
export class HomePage {
public allList:any;
constructor(public navCtrl: NavController) {
this.allList=[{
name:'NES',
values:'nes',
flag:0
},{
name:'Nintendo64',
values:'n64',
flag:0
},{
name:'PlayStation',
values:'ps',
flag:0
}];
}
valuechange(key){
for(let i = 0 ; i < this.allList.length ; i++){
if( this.allList[i].values==key){
this.allList[i].flag=1;
}else{
this.allList[i].flag=0;
}
}
}
}
Hope, this will resolve your issue
Thanks,
1 Like
OMG thank you, this really solve my issue, but I’m having a new issue with it. So I want to display the selected data on a button, like this:
<button ion-button block (click)="getData(gaming1, gaming2)">PassingData</button>
Component:
getData(selectedValue){
console.log("Selected", selectedValue);
}
But it only take the 1st value only.
edit: Wait, it should be like this right (click)="getData(gaming1 + gaming2)"
I would do this differently.
<ion-item>
<ion-select [(ngModel)]="console1">
<ion-option *ngFor="let console of consoles" [value]="console">{{console.displayName}}</ion-option>
</ion-select>
</ion-item>
<ion-item>
<ion-select [(ngModel)]="console2">
<ng-container *ngFor="let console of consoles">
<ion-option *ngIf="console.name !== console1.name" [value]="console">{{console.displayName}}</ion-option>
</ng-container>
</ion-select>
</ion-item>
You don’t need the flag property, you don’t need the change handler, you don’t need to pass anything to your button click handler: everything you need is already in console1 and console2.
Having error with it , Runtime Error Cannot read property 'name' of undefined
Well, obviously you have to have the objects in the consoles entries have the relevant properties to match the template syntax.
And presumably you initialized console1 and console2 to at least empty objects? You can’t leave them undefined.
EDIT: I changed the bound property to be the entire object instead of the name.
Can you show me how? I dont get it, sorry.
Whenever you declare an object or array property that is accessed in the template, give it an initializer. The simplest ones are:
foo = {} as Foo;
bars = [] as Bar[];
So in your case, make sure console1 is initialized to at least {} as whatever type your console object is.
I assumed template is in .ts file?