Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ionic2 Ion-select without OK and Cancel

I have built an Ionic2 app and I am currently trying to improve the UX. To do that, I received some feedback that made me think of whether there is a way of having a

    <ion-select>
      <ion-option>
      </ion-option>
    </ion-select>

which upon tapped on, would give me the output straight away and not wait for the user to press on the currently appearing 'OK'and 'CANCEL' buttons that the ionic action sheet(http://ionicframework.com/docs/v2/api/components/select/Select/) uses by default.

Any suggestions will be greatly appreciated! :)

EDIT:

As @sebaferrreras has suggested,

If the number of options exceed 6, it will use the alert interface even if action-sheet is passed.

So if you need to use more than 6 options, you are going to have to find a workaround as for the moment, this functionality is NOT listed under the Ionic2 docs.

like image 349
user3153278 Avatar asked Aug 18 '16 09:08

user3153278


People also ask

How do you get selected value from ion select?

We can access the Ionic select by using a standard <ion-select> element. A select component always used with child <ion-select-option> element. If the <ion-select-option> does not have a value attribute, then its text will be used as the value.

How do I set default value in ion select?

If you deal with default value xor objects, the cleanest way is to provide a compare function to the [compareWith] attribute. This function takes 2 objects in parameters and returns true if they are equals. This way, existing values in model will be selected at start.

Which attributes allows the user of ion select to select not only one choice but any choices?

By adding the multiple attribute to select, users are able to select multiple options.


2 Answers

Implementation made in Ionic version 6.12.3:

In your HTML create the ion-select. Add the attibute [interfaceOptions]="randomOptions":

<ion-select interface="action-sheet" [interfaceOptions]="randomOptions" ngModel>
    <ion-select-option value="...">Option #1</ion-select-option>
    <ion-select-option value="...">Option #2</ion-select-option>
</ion-select>

In your TS create a public variable with the exact name you gave in the HTML and add the options you intend for ion-select. Add the attribute cssClass: 'randomCSSClassName':

public randomOptions: any = { 
    cssClass: 'randomCSSClassName',
    ...
};

For last, in your global.scss file just add a CSS class with the exact same name you gave in TS and just add the class .action-sheet-group-cancel with a display: none:

.randomCSSClassName {
    .action-sheet-group-cancel {
        display: none;
    }
}

This implementation was tested in Web, iOS and Android. It works perfectly!

like image 170
Grinnex. Avatar answered Oct 24 '22 05:10

Grinnex.


I know this thread is 7 months old and the OP is probably long past this question but since the feature is yet to be added to ionic framework, I'm adding the workaround I came up with for other people's reference.

CSS PART

Intuitively the first thing you need to do is to add some sass/css to hide the unwanted buttons. I did that by passing a css class "remove-ok" to selectOptions for my ion-select element. (I'm only removing OK button but if someone needs to remove cancel button as well, that's an easy css modification).

In component:

this.selectOptions = {
      cssClass: 'remove-ok'
    };

and in HTML:

<ion-select [selectOptions]="selectOptions">

And in app.scss add:

.remove-ok {
    .alert-button:nth-child(2) {
        display: none;
    }
}

SCRIPT PART

Now that the OK button is hidden, you will need to somehow close the alert view.

To invoke click() event on the hidden OK button is straightforward and intuitive but you'll soon find out that although it works perfectly on ionic serve, it won't work on an actual iOS device.

The solution is to find reference to the alert view, pass the checked option to the select handler, and finally dismiss the view.

So in ngOnInit in your component class, you'll need this:

ngOnInit() {
        let root = this.viewController.instance.navCtrl._app._appRoot;
        document.addEventListener('click', function(event){
        let btn = <HTMLLIElement> document.querySelector('.remove-ok .alert-button-default:nth-child(2)');
        let target = <HTMLElement> event.target;
        if(btn && target.className == 'alert-radio-label')
        {
              let view = root._overlayPortal._views[0];
              let inputs = view.instance.d.inputs;
              for(let input of inputs) {
                if(input.checked) {
                  view.instance.d.buttons[1].handler([input.value]);
                  view.dismiss();
                  break;
                }
              }
            }
        });
    }

Again, if you intend to remove the Cancel button as well, mind the css references in this code.

like image 39
Vahid Avatar answered Oct 24 '22 04:10

Vahid