Adding a mixin to a class in a plugin?

I need to modify a javascript controller (create-account). If I were writing it from scratch, I’d add a mixin called something like (FooValidation), the same way the mixins PasswordValidation and UsernameValidation are applied (https://github.com/discourse/discourse/blob/f03b6bd8c925163b41b9e33b39484d102dbaee44/app/assets/javascripts/discourse/controllers/create-account.js.es6#L13). I can’t figure out how, though.

I could just add the relevant properties/methods to the create account controller using PluginApi.modifyClass, but that doesn’t feel right, especially seeing as I’ll want to reuse the mixin.

What’s the best way to achieve this?

I believe the modifyClass method accepts a mixin as an argument, so I’d try something like this:

api.modifyClass("controller:create-account", FooValidation);
4 Likes

Ah you’re right, modifyClass calls Ember’s reopen, which can take mixins as an argument. I couldn’t get it to work at first but I got it! Thanks!

2 Likes

can you share some sample code?

I do it in Topic List Previews: https://github.com/paviliondev/discourse-topic-previews/blob/master/assets/javascripts/discourse/initializers/preview-edits.js.es6

Specific example: api.modifyClass('component:topic-list', Settings);

I did this to break out shared code that would otherwise have been repeated and almost a cut and paste.

3 Likes