Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

ember-elsewhere

ef418.7kMIT2.0.0

Render elsewhere in the DOM, with nice composition, animation, etc. Based on 100% public API.

ember-addon, wormhole, modal, popup, sidebar, toolbar

readme

ember-elsewhere

NPM Ember Observer Score Ember Version

This addon makes it easy to manage sidebars, toolbars, popups, modals, or any piece of DOM that you want to lift outside your normal route hiearchy.

It is similar to ember-wormhole, but is a better choice when your target is within your own Ember app (as opposed to arbitrary, potentially foreign DOM). It is also easier to compose with animations and it's based on 100% public API.

The best documentation is the sample application in tests/dummy, which is also running at http://ef4.github.io/ember-elsewhere/.

Install

ember install ember-elsewhere

Components

Create a target named "my-right-sidebar":

<FromElsewhere @name="my-right-sidebar" />

Anywhere else in your app, declare which component should render in the target -- complete with bound inputs and actions:

<ToElsewhere @named="my-right-sidebar" @send=(component "cool-thing" model=model launch=(action "launchIt"))/>

For fancier behaviors, you can use the block form of <FromElsewhere>, which gives you an opportunity to extend the target's behavior in arbitrary ways. For example, this lets your target animate as its content changes:

<FromElsewhere @name="modal" as |modal|>
  {{#liquid-bind modal as |currentModal|}}
    <div class="modal-background"></div>
    <div class="modal-container">
      {{component modal}}
    </div>
  {{/liquid-bind}}
</FromElsewhere>

Rendering multiple components into a single target

There might be use cases where you would like to render multiple component into a single target, for example a <FromElsewhere> "actions" might receive multiple action buttons via <ToElsewhere>. Instead of <FromElsewhere/> just use the complementary <MultipleFromElsewhere> component.

<MultipleFromElsewhere @name="actions"/>
<!-- ... -->
<ToElsewhere @named="actions" @send={{component "test-button" text="Button1"}} />
<ToElsewhere @named="actions" @send={{component "test-button" text="Button2"}} />
<ToElsewhere @named="actions" @send={{component "test-button" text="Button3"}} />

Passing additional state through to the target

When you're using the block form of <FromElsewhere>, it's entirely up to you what information you pass to the target. It can be more than just a component. Here is a complete example of an animatable modal that supports an onOutsideClick action while providing shared layout for the background and container:

<ToElsewhere @named="modal"
             @send={{component "warning-message"}}
             @outsideParams={{hash onOutsideClick=this.close 
                                   title="modal title"}} />
<FromElsewhere @name="modal" as |modal outsideParams|>
  {{#liquid-bind modal as |currentModal|}}
    <div class="modal-container">
      <div class="modal-background" {{on "click" outsideParams.onOutsideClick}}></div>
      <div class="modal-dialog" >
        <div class="modal-title">{{outsideParams.title}}</div>
        <currentModal />
      </div>
    </div>
  {{/liquid-bind}}
</FromElsewhere>

If you plan to send a component, you can use Ember's component helper. The component helper accepts the component name and other properties, such as {{component "my-component-name" someValue="something"}}, which will cover most use cases. However, if you need to provide additional content to use outside of the component scope, that is when you can use the outsideParams attribute.

Crossing Engines

Engines deliberately are deliberately isolated from each other, so a <ToElsewhere> in one engine cannot target a <FromElsewhere> in another. But you can optionally share the ember-elsewhere service between them to make it work, see https://github.com/ef4/ember-elsewhere/issues/26#issuecomment-432217049

Ember's native in-element

Since Ember 3.21 there is also a native in-element helper. This helper offer less functionality than this addon, but may be enough for some use-cases. More details

Linting

Running tests

  • npm test (Runs ember try:testall to test your addon against multiple Ember versions)
  • ember test
  • ember test --server

Running the dummy application

For more information on using ember-cli, visit http://www.ember-cli.com/.

changelog

Changelog

2.0.0

  • BREAKING: drop support for Ember < 3.24
  • BREAKING: drop support for Node < 12
  • COMPAT: fully-compatible with Ember 4 and Embroider

1.2.2

  • COMPAT: fix this fallback deprecation

1.2.1

  • COMPAT: fix deprecations in newer ember versions

1.2.0

  • FEATURE: add the outsideParams option to multiple-from-elsewhere too

1.1.0

  • FEATURE: new outsideParams attribute #31

1.0.5

  • BUGFIX: workaround an issue in Ember 3.3+
  • HOUSEKEEPING: update test dependencies to ember-cli 3.3, etc.

1.0.4

  • ENHANCEMENT: warn on commonly misnamed parameter
  • BUGFIX: workaround travis chrome sandboxing issue

1.0.3

  • ENHANCEMENT: improved fastboot support and test coverage

1.0.2

  • HOUSEKEEPING: update ember-cli, etc

1.0.1

  • BUGFIX: guard against access after destruction
  • BUGFIX: fastboot compat

1.0.0

  • FEATURE: new multiple-from-elsewhere component by @vladucu
  • I'm naming this 1.0.0 because the public API has remained stable for a while.

0.4.1

  • BUGFIX: newer ember-cli-htmlbars to avoid build-time deprecation warning about calling super from init

0.4.0

  • BREAKING: to-elsewhere and from-elsewhere are now both tagless, since they don't need elements for anything and the divs just clutter up your DOM. This could potentially break your CSS when you upgrade from 0.3.0.