Skip to the content.

Retour

Hérite de MelObject

/**
* @module MaClass
*/

import { MelObject } from "../../../../mel_metapage/js/lib/mel_object.js":
import { MelEnumerable } from "../../../../mel_metapage/js/lib/classes/enum.js":
export { MaClass }

/**
* @class
* @classdesc Description de la classe
* @extends MelObject
*/
MaClass extends MelObject {
    constructor() { super(); }

    /**
    * Initialise les membres de la classe
    * @package (privée, mais affiché sur la doc)
    * @return {MaClass} Chaînage
    */
    _init() {
        /*
        * Description de la variable membre
        * @type {Object.<!string, any>}
        */
        this._data = {};

        return this;
    }

    /**
    * On écrit le code principale de la fonction
    */
    main() {
        super.main();

        this._init()._generate_listeners();
    }

    /**
    * Génère les listeners
    * @package
    */
    _generate_listeners() {
        this.rcmail().addEventListener('refresh', this.update_data.bind(this));
        this.add_event_listener('refresh', this.update_data_bind(this));
    }

    /*
    * Récupère les données
    * @return {Generator}
    */
    get_data() {
        return MelEnumerable.from(this._data).select(x => x.value);
    }

    /*
    * Ajoute un objet aux données
    * @param {any} item Objet a être ajouté
    * @return {MaClass} Chaînage
    */
    add(item) {
        this._data[MaClass.GenerateId()] = item;

        return this;
    }

    /**
    * Est appelé par les listeners
    * @param {any} data
    */
    update_data(data) {
        this._data = MelEnumerable.from(data).toJsonDictionary(x => x.index, x => x.convert());
        this.rcmail().triggerEvent('MaClass.Updated', {obj:this});
        this.trigger_event('MaClass.Updated', {obj, this});
    }

    /**
    * Génère un Id
    * @static
    * @return {number}
    */
    static GenerateId() {
        let id = '';

        //Do something

        return id;
    }
}

Structure ou classe utile

/*
* @module MaStruct
*/
export { MaStruct }

/**
* @class
* @classdesc Description de la classe
class MaStruct {
    /**
    * @param {...any} args Description des paramètres
    */ 
    constructor(...args) {

    }

    /**
    * Initialise les membres de la classe
    * @private
    * @return {MaStruct} Chaînage
    */
    _init() {
        //[...]
        //protected
        //private
        //public
        //const

        return this;
    }

    /**
    * Assigne les variables
    * @private
    * @param {...any} args Description des paramètres
    * @return {MaStruct} Chaînage
    */
    _setup(...args) {
        //[...]
        return this;
    }

    /**
    * Code principale de la classe, optionnel si inutile
    * @param {...any} args Description des paramètres
    * @return {MaStruct} Chaînage
    */
    _main(...args) {
        //[...]
        return this;
    }

    _p_protected_function() {}

    _private_function() {}

    public_function() {}

    static _PrivateStaticFunction() {}

    static PublicStaticFunction() {}
}

/**
* Description de la donnée constante
* @type {string}
* @constant
*/
MaStruct.CONSTANT = 'SOMETHING';

Object.defineProperty(MaStruct, 'CONSTANT', {
    value:MaStruct.CONSTANT,
    writable:false,
    configurable:false
});

Bonne pratiques

On initialise les variables membres dans _init().
On assigne dans _setup(...args).
et on code dans _main(...args).
La variable se nomme main(...args) si on hérite de MelObject, dans ce cas, _init et _setup seront appelé dans main.

On met d’abord ce qui est protégé, ensuite ce qui est privé, puis ce qui est public et enfin ce qui est constant.

Les tips javascript, c’est ici !

JsDoc

Structure

A la racine du plugin, définir un fichier jsdoc.definitions.js et y mettre :

/*
* @namespace NomDuPlugin
*/

Dans ce fichier, on va y définir le namespace de la documentation et les modules membres qui lui apartiennent.

Donc, à chaque fois que l’on ajoute un module javascript, on ajoute : @property {module:monmodule} monmodule, exemple :

/*
* @namespace NomDuPlugin
* @property {module:Main} Main
*/

Callback

/*
* @callback Where
* @param {!any} item
* @param {!number} index
* @return {boolean}
*/

/**
* Description
* @param {Array} array
* @param {Where} callback
* @yield {!any}
* @generator
function where(array, callback) {
    let i = -1;
    for (const item of array) {
        if (callback(item, ++i)) yield item;
    }
}

Lien vers JSDoc

C’est ici