Si vous souhaitez participer à la vie de dojotookit-fr, nous recherchons : des traducteurs, des personnes pour animer le blog ou écrire des articles, etc...
Prévenez nous par mail (ben_AT_dojotoolkit-fr_DOT_org) ou par chat (#dojo-fr sur irc.freenode.net)

Custom build, singleton et fichier de localisation

Tagged:

Pour le projet sur lequel je travaille, nous avons découpé notre application en widgets et en singleton.
La différence entre les deux est minime.
Alors qu'un fichier de widget se termine par "});" (pour clôturer le dojo.declare), le singleton ajoute 2 lignes qui servent à le créer :

1
2
3
 
if(!ext.mySingleton)
        ext.mySingleton = new ext.MySingleton();

Cela ne pose aucun problème à la build... sauf si votre singleton à besoin d'accéder aux localisations.
Au chargement de votre page, vous obtenez à peu près l'erreur suivante :

1
2
3
 
        Error: Bundle not found: loading in dijit , locale=
 

Il faut savoir que lors de la build, tous vos widgets sont packagé en un seul fichier et à la fin de se fichier est ajouté une ligne pour charger les localisations.
Et tous le problème est la...
Comme votre singleton se crée (et donc demande à dojo les localisations) AVANT que celles-ci ne soient effectivement disponible (puisque chargées en fin de fichier) tout se met à planter.
Pour éviter ce problème, voici la la seule solution que j'ai trouvé :

  • Utiliser les même localisations dans les widgets et dans les singletons

    1
    2
    
    dojo.i18n.getLocalization("ext.myWidgets.lang","locale"); //pour les widgets et les singletons
     

  • Créer, lors de la build, 2 fichiers JS : un qui inclus les widgets, le second les singletons.
  • Charger (via une balise script normale) le fichier des widgets puis celui des singletons

Avec ça tout devrait bien se passer. Le chargement du fichier des widgets appelle le fichier de localisation qui sera réutilisé indirectement par le fichier des singletons.

Évidement il doit exister mieux. Donc si quelqu'un connais une meilleur façon de faire, je suis preneur :)

Commentaires

Merci pour l'astuce

Merci pour l'astuce, j'ai eu le problème ce soir sans vraiment comprendre le problème.

En fait j'ai réalisé une application avec un main.js comme singleton. Ce singleton une fois buildé provoquait l'erreur que tu as décrite.

Ce que j'ai fait pour contourner le problème: j'ai créé mon singleton dans ma page principale Html après le chargement de mon dojo.js buildé. Et maintenant tout fonctionne impec'

Merci Ben