Skip to content

Instantly share code, notes, and snippets.

@kaspermeyer
Created January 19, 2019 18:33
Show Gist options
  • Save kaspermeyer/0fcfb818e933769a81a54f445b93a01b to your computer and use it in GitHub Desktop.
Save kaspermeyer/0fcfb818e933769a81a54f445b93a01b to your computer and use it in GitHub Desktop.
Stimulus controller to alias other Stimulus controllers
import { Controller } from "stimulus";
export default class extends Controller {
initialize() {
this.registerAliasedControllers()
}
registerAliasedControllers() {
for (let [alias, original] of this.controllerIdentifiersByAlias) {
if (!this.moduleForIdentifier(alias)) {
this.application.register(alias, this.constructorForIdentifier(original))
}
}
}
constructorForIdentifier(identifier) {
return this.moduleForIdentifier(identifier).definition.controllerConstructor;
}
moduleForIdentifier(identifier) {
return this.application.router.modulesByIdentifier.get(identifier)
}
get aliasDescriptors() {
return this.element.dataset.alias.split(/\s/);
}
get controllerIdentifiersByAlias() {
return new Map(this.aliasDescriptors.map(descriptor => descriptor.split(/->/)))
}
}
@forelabs
Copy link

Thanks, tried it out and worked for me for my use case, but having this alias globally defined in the process is probably a problem for future stuff. I hope it is free to use and I am allowed to improve, if needed.

import { Controller } from "stimulus";

export default class extends Controller {
    initialize() {
        this.registerAliasedControllers();
    }

    private registerAliasedControllers() {
        for (let [alias, original] of this.controllerIdentifiersByAlias) {
            if (!this.moduleForIdentifier(alias)) {
                this.application.register(alias, this.constructorForIdentifier(original));
            }
        }
    }

    private constructorForIdentifier(identifier) {
        return this.moduleForIdentifier(identifier).definition.controllerConstructor;
    }

    private moduleForIdentifier(identifier) {
        return (<any>this.application.router).modulesByIdentifier.get(identifier);
    }

    private get aliasDescriptors() {
        return (<HTMLElement>this.element).dataset.alias.split(/\s/);
    }

    private get controllerIdentifiersByAlias(): any {
        return this.aliasDescriptors.map(descriptor => descriptor.split(/->/));
    }
}

@kaspermeyer
Copy link
Author

@forelabs, glad it worked for you! You're welcome to use however you like.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment