Skip to content

AMD module init called too many times #28

@FMCorz

Description

@FMCorz

The init function of the AMD module is executed for each piece of text that is being passed through filters. This leads to a large number of redundant JavaScript calls, like this:

M.util.js_pending('filter_tabs/tabs'); require(['filter_tabs/tabs'], function(amd) {amd.init(); M.util.js_complete('filter_tabs/tabs');});;
M.util.js_pending('filter_tabs/tabs'); require(['filter_tabs/tabs'], function(amd) {amd.init(); M.util.js_complete('filter_tabs/tabs');});;
M.util.js_pending('filter_tabs/tabs'); require(['filter_tabs/tabs'], function(amd) {amd.init(); M.util.js_complete('filter_tabs/tabs');});;
M.util.js_pending('filter_tabs/tabs'); require(['filter_tabs/tabs'], function(amd) {amd.init(); M.util.js_complete('filter_tabs/tabs');});;
M.util.js_pending('filter_tabs/tabs'); require(['filter_tabs/tabs'], function(amd) {amd.init(); M.util.js_complete('filter_tabs/tabs');});;
M.util.js_pending('filter_tabs/tabs'); require(['filter_tabs/tabs'], function(amd) {amd.init(); M.util.js_complete('filter_tabs/tabs');});;
M.util.js_pending('filter_tabs/tabs'); require(['filter_tabs/tabs'], function(amd) {amd.init(); M.util.js_complete('filter_tabs/tabs');});;
M.util.js_pending('filter_tabs/tabs'); require(['filter_tabs/tabs'], function(amd) {amd.init(); M.util.js_complete('filter_tabs/tabs');});;
M.util.js_pending('filter_tabs/tabs'); require(['filter_tabs/tabs'], function(amd) {amd.init(); M.util.js_complete('filter_tabs/tabs');});;
M.util.js_pending('filter_tabs/tabs'); require(['filter_tabs/tabs'], function(amd) {amd.init(); M.util.js_complete('filter_tabs/tabs');});;
M.util.js_pending('filter_tabs/tabs'); require(['filter_tabs/tabs'], function(amd) {amd.init(); M.util.js_complete('filter_tabs/tabs');});;
M.util.js_pending('filter_tabs/tabs'); require(['filter_tabs/tabs'], function(amd) {amd.init(); M.util.js_complete('filter_tabs/tabs');});;

As documentated in the base filter class, the function setup of the filter must handle repeated calls:

    /**
     * Setup page with filter requirements and other prepare stuff.
     *
     * [...]
     *
     * Note this method is invoked from {@see setup_page_for_filters()}
     * for each piece of text being filtered, so it is responsible
     * for controlling its own execution cardinality.
     *
     * [...]
     */
    public function setup($page, $context) {}

However, filter_tabs does not:

    public function setup($page, $context) {
        $this->page = $page;
        $page->requires->js_call_amd('filter_tabs/tabs', 'init');
    }

It appears the solution is as simple as the following (copied from the Glossary filter):

    public function setup($page, $context) {
        if ($page->requires->should_create_one_time_item_now('filter_glossary_autolinker')) {
            // Code here.
        }
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions