DEV Community

Prasanna Vijayan
Prasanna Vijayan

Posted on • Edited on

Use Promise for popup

There are lot of things you can do with Promise. Today, I will share my experience on using promise for modal which I recently learned.

If you don't know much about EmberJs or Promise. Please visit EmberJS and
Promise) to get your basics up

Why Promise?

https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-promise-27fc71e77261

Prerequisites

ember install ember-bootstrap
ember generate ember-bootstrap --preprocessor=sass
Enter fullscreen mode Exit fullscreen mode

If you want to use less instead of sass use --preprocesor=less. For other config, please check here

Steps

  1. Create your component using
ember generate component promise
Enter fullscreen mode Exit fullscreen mode
  1. promise.js
import Component from '@ember/component';

export default Component.extend({

  // It's important to have response undefined instead of boolean
  response : undefined,
  show     : false,

  actions: {
    promiseClicked() {
      new Promise( respond => {
        this.set( 'show', true );

        this.addObserver( 'response', function observer() {
          this.removeObserver( 'response', observer );
          respond( this.get( 'response' ) )
        });

      }).then( proceed => {
        if ( proceed ) {
          console.log( proceed );
        } else {
          console.log( proceed );
        }
        this.setProperties({ 'show': false, 'response': undefined });
      });
    },

    response( bool ) {
      this.set( 'response', bool );
    }
  },
});
Enter fullscreen mode Exit fullscreen mode

Make sure variable response is set to undefined after removing observer.

  1. promise.hbs
<BsButton @onClick={{action 'promiseClicked'}}> Promise </BsButton>

<BsModal
  @open={{show}}
  @onSubmit={{action "response" true}}
  @onHidden={{action "response" false}} as |modal|>
  <modal.header>
    <h4 class="modal-title">
      Custom Dialog
      <div class="badge">2</div>
    </h4>
  </modal.header>
  <modal.body>
    Promise Example?
    Check console when you click "Cancel or Save".
  </modal.body>
  <modal.footer>
    <BsButton @onClick={{action "response" false}}>Cancel</BsButton>
    <BsButton @type="success" @onClick={{action "response" true}}>Save</BsButton>
  </modal.footer>
</BsModal>
Enter fullscreen mode Exit fullscreen mode

That's it. Thanks!

Top comments (0)