You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: _posts/2012-02-25-backbone-tips-from-document-cloud.md
+39-24Lines changed: 39 additions & 24 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -124,9 +124,9 @@ application.js :
124
124
// Provide top-level namespaces for our javascript.
125
125
(function() {
126
126
window.dc = {};
127
-
dc.app = {};
128
-
dc.ui = {};
129
-
dc.model = {};
127
+
dc.app = {}; /* anythiung that is shared globally in the application */
128
+
dc.ui = {}; /* views */
129
+
dc.model = {}; /* models and collections */
130
130
})();
131
131
{% endhighlight %}
132
132
@@ -244,7 +244,11 @@ dc.app.router = new dc.app.MyRouter();
244
244
245
245
#### Dépendances partagées hiérarchiquement
246
246
247
-
Nous aurons besoin de découper nos modules, en sous modules et donc de faire dépendre nos modules de nos sous-modules. Comme les sous-modules ne seront utilisées que par le module, nous pouvons les attacher directement à l'instance du module parent :
247
+
Dans une application, nous auvons toujours besoin de découper des modules, en sous modules et donc d'avoir une relation de dépendance entre les deux.
248
+
249
+
Mais comme cette relation est du type parent - enfant, ce sera toujours via le module parent que les enfants pourront discutté entre eux.
250
+
251
+
Nous allons donc attaché les instances des enfants au parent.
248
252
249
253
{% highlight javascript %}
250
254
dc.app.editor = new Backbone.View.extend({
@@ -255,7 +259,6 @@ dc.app.editor = new Backbone.View.extend({
255
259
},
256
260
257
261
createSubViews : function() {
258
-
dc.ui.notifier = new dc.ui.Notifier();
259
262
this.controlPanel = new dc.ui.ViewerControlPanel();
260
263
this.sectionEditor = new dc.ui.SectionEditor();
261
264
this.annotationEditor = new dc.ui.AnnotationEditor();
@@ -266,12 +269,13 @@ dc.app.editor = new Backbone.View.extend({
266
269
},
267
270
{% endhighlight %}
268
271
269
-
Regardez également comment le module parent partage sont instance avec ses modules enfants : `new dc.ui.ReplacePagesEditor({editor : this})`
272
+
Regardez également comment le module parent partage son instance avec ses enfants : `new dc.ui.ReplacePagesEditor({editor : this})`.
273
+
C'est ainsi que les enfants peuvent discutter avec le module parent, ou discutter avec les autres enfants.
270
274
271
275
272
276
#### Remarque sur RequireJS
273
277
274
-
Si pendant la lecture de ce paragraphe vous vous dites que vous n'avez pas besoin de tout ça car vous avez RequireJs. Ben sachez que lorsque vous définissez un module avec RequireJs, vous avez le choix entre retourner une classe, ou un singleton, mais faire les deux devient problématique.
278
+
Si pendant la lecture de ce paragraphe vous vous dites que vous n'avez pas besoin de tout ça car vous avez RequireJs. Ben sachez que lorsque vous définissez un module avec RequireJs, vous avez le choix entre retourner une classe, ou un singleton, mais faire les deux devient problématique. Vous aurez donc solutionné un problème, mais pas les deux.
Le plus simple pour faire communiquer deux modules entre eux c'est de les faire interagir directement. Je vous entend crier au loin, mais c'est fortement coupler ça !!!
299
303
300
-
Comme il n'y a pas de typage fort en javascript vous vous en moquez! C'est comme si vous utilisiez des interfaces en Java. Si vous voulez remplacer un module par un autre, il suffit que les deux modules possèdes les mêmes signatures de fonctions et vous pouvez les remplacer.
304
+
Comme il n'y a pas de typage fort en javascript vous vous en moquez! C'est comme si vous utilisiez des interfaces en Java. Si vous voulez remplacer un module par un autre, il suffit que les deux modules possèdent les mêmes signatures de fonctions et vous pouvez les remplacer.
301
305
302
-
Maintenant si vous voulez savoir quelles sont les fonctions publiques et les fonctions privées, je vous déconseil de les préfixer par un _. Deja c'est moche et en plus c'est inutile car un simple grep suffit pour savoir quelles sont les methodes publiques :
306
+
Maintenant si vous voulez savoir quelles sont les fonctions publiques et les fonctions privées, je vous déconseil de les préfixer par un _. Deja c'est moche et en plus c'est inutile car un simple grep suffit pour savoir quelles sont les méthodes publiques :
Après vous pouvez communiquez via des événements, mais il faudra un peu plus de travail pour synchroniser plusieurs événements. Et les appels seront moins facile à repérer dans le code. Le problème avec les événements en JS, c'est que l'on perd vite le contrôle de l'application et tout parait magique. Je ne vous interdit pas d'utiliser les événement, mais faîtes le avec parcimonie et justesse.
314
+
Après vous pouvez communiquez via des événements, mais il faudra un peu plus de travail pour synchroniser plusieurs événements.
315
+
De plus, les appels seront moins facile à repérer dans le code.
316
+
317
+
Le problème avec les événements en JS, c'est que l'on perd vite le contrôle de l'application et tout parait magique.
318
+
Je ne vous interdit pas d'utiliser les événement, mais faîtes le avec parcimonie et justesse.
311
319
312
320
313
321
### Utiliser le modèle objet
314
322
315
323
Quand vous utilisez Backbone,vous créez des classes filles de Backbone.View, Backbone.Model, Backbone.Collection, ...
316
324
317
-
Alors pourquoi ne pas créer ses propres classe mère. Par exemple :
325
+
Alors pourquoi ne pas créer ses propres classe mère :
Une des choses les plus belles avec Backbone c'est l'attribut `this.el`, et les nombreuses utilisation : `this.$el`, `this.$`, ...Il vous permet de limiter l'interaction qui vous aurez avec le DOM. Non seulement vous gagnez en performance (les sélecteurs jQuery sont précis) mais en plus il vous empêche de modifier des éléments qui n'appartiennent pas à votre vue.
372
+
Une des choses les plus belles avec Backbone c'est l'attribut `this.el`, et les nombreuses utilisations : `this.$el`, `this.$`, ... Utiliser `el` vous permet de limiter l'interaction qui vous aurez avec le DOM. Non seulement vous gagnez en performance (les sélecteurs jQuery sont précis) mais en plus il vous empêche de modifier des éléments qui n'appartiennent pas à votre vue.
364
373
365
374
Alors vous l'aurez compris, je ne veux plus voir de `$` dans vos applications Backbone, seulement des `this.$`:D
366
375
367
-
### Des conventions qui rendent la lecture du code tellement agréable.
376
+
### Des conventions qui rendent la lecture du code tellement plus agréable.
368
377
369
378
Il y a une autre chose que j'aime dans Backbone, ce sont ses conventions. Par exemple dans une vues, on repère instantanément les interactions utilisateurs :
370
379
@@ -379,7 +388,7 @@ events : {
379
388
},
380
389
{% endhighlight %}
381
390
382
-
Mais vous pouvez faire la même chose ailleurs. Choisir des conventions et s'y tenir, par exemple les constantes et haut et en majuscule :)
391
+
Mais vous pouvez faire la même chose partout, choisir des conventions et s'y tenir. Par exemple, mettre les constantes et haut et en majuscule :)
@@ -390,9 +399,10 @@ Mais vous pouvez faire la même chose ailleurs. Choisir des conventions et s'y t
390
399
Tout le monde connait les plugins jQuery. Mais saviez vous que vous pouvez faire la même chose avec Backbone?
391
400
392
401
Par exemple dans DocumentCloud il y a un plugin bien pratique le `setMode`.
393
-
SetMode permet de gérer une machine à état au niveau de ses vues. Lorsque l'on fait un setMode, on ajoute une classe CSS sur le `el` de la vue (pratique pour le CSS) mais on ajoute aussi un attribut sur la vue pour faciliter les interactions inter-modules.
402
+
SetMode permet de gérer une machine à état au niveau de ses vues. Lorsque l'on fait un setMode, on ajoute une classe CSS sur le `el` de la vue (pratique pour le CSS) mais on ajoute aussi un attribut sur l'instance de la vue afin de faciliter les interactions inter-modules.
403
+
394
404
395
-
Par exemple :
405
+
Je sens que vous n'avez pas bien compris, voici un exemple dans une vue :
396
406
397
407
{% highlight javascript %}
398
408
xxx.setMode('is', 'draggable');
@@ -443,7 +453,10 @@ $.fn.extend({
443
453
444
454
### Ne pas se limiter à l'utilisation classique de Backbone
445
455
446
-
Backbone est suffisamment petit pour que n'importe quel développeur se sente à l'aise avec les sources. Vous pouvez donc utiliser Backbone avec un minimum de couche.
456
+
Backbone est suffisamment petit pour que n'importe quel développeur se sente à l'aise avec les sources.
457
+
Franchement c'est tellement rare ça alors profittez en !
458
+
459
+
Vous pouvez avoir une utilisation minimaliste de Backbone.
447
460
448
461
Regarder par exemple la HomePage de DocumentCloud <https://github.com/lyonjs/documentcloud/blob/master/public/javascripts/home/home.js>
449
462
@@ -491,7 +504,7 @@ Ici prenons l'exemple d'un document contenant une liste d'annotations :
491
504
}
492
505
{% endhighlight %}
493
506
494
-
Nous allons sortir les annotations du document afin de gérer indépendamment.
507
+
Nous allons sortir les annotations du document afin de les gérer indépendamment.
Souvent nous aurons besoin de lier les événements du sous-modèle avec le modèle. Il faudra le faire à la main, mais toute la démarche est bien expliquée sur le site officiel : <http://documentcloud.github.com/backbone/#FAQ-nested>. Ce n'est pas trop difficile à faire et tout parait très logique.
521
+
Souvent vous aurez besoin de lier les événements du sous-modèle avec le modèle.
522
+
Il faudra le faire à la main, mais toute la démarche est bien expliquée sur le site officiel : <http://documentcloud.github.com/backbone/#FAQ-nested>.
523
+
Ce n'est pas trop difficile à faire et tout est très logique.
509
524
510
525
### Et pour finir : la minification de vos fichier JS.
511
526
512
527
Vous n'alliez pas mettre en prod votre application avec tout ces petits
513
528
fichiers ...
514
529
515
530
Comme nous n'avons pas utilisé de loader javascript vous être entièrement
516
-
libre de choisir le minifier JS que vous voulez.
531
+
libre de choisir le minifieur JS que vous voulez. Et c'est un luxe ça !!!
517
532
518
-
Je vais vous aider, si vous n'avez pas de Backend choisissez le build script HTML5BoilerPlate.
533
+
Si vous n'avez pas de Backend choisissez [le build script de HTML5BoilerPlate](http://html5boilerplate.com/docs/Build-script/).
519
534
520
-
Si vous utilisez un Backend en JAVA Wro4J est un projet sérieux que vous pouvez utiliser sans risque.
535
+
Si vous utilisez un Backend en JAVA [Wro4J](http://code.google.com/p/wro4j/) est un projet sérieux que vous pouvez utiliser sans risque.
521
536
522
-
Mais n'oubliez pas de servir vos assets JS et CSS avec la compression GZIP.
537
+
Et n'oubliez pas de servir vos assets JS et CSS avec la compression GZIP :)
0 commit comments