Nouvelle technique de rendu

From OFSET Wiki

Jump to: navigation, search

Traduction de : http://lists.squeakfoundation.org/pipermail/seaside/2005-June/005260.html

Seaside



Le problème majeur que Canvas (canevas) essaye de résoudre est l'explosion du nombre de méthodes dans WAHtmlRenderer. Considérons quelque chose comme un text input. La méthode standard originale pour créer un text input était #textInputWithValue:callback:

html textInputWithValue: person name callback: [:v | person name: v]

Mais on peut aussi utiliser un autre méthode avec le motif ...on:of:

html textInputOn: #name of: person

Et aussi une autre en utilisant les mises à jour en direct (liveCallback) :

html textInputWithValue: person name callback: [:v | person name: v] liveCallback: [:r :v | ...]

Que faire si l'on veut utiliser ces deux techniques en même temps ? A t'on aussi besoin d'un #textInputOn:of:liveCallback: ? Et en ce qui concerne #passwordInputOn:of:liveCallback: ? Et ainsi de suite... C'est vraiment facile d'ajouter de nouvelle méthode de simplification, mais ça devient très difficile de les combiner, même quand (comme dans ce cas) elles sont orthogonales.

La nouvelle technique de rendu, Canvas, est juste un simple changement du syle de l'API qui rend ce type de combinaison bien plus facile. Il divise ce qui aurait été une simple méthode de HtmlRenderer en 3 étapes : d'abord, vous choisissez un type de brosse (tag la plupart du temps) que vous voulez utiliser. Par exemple, la méthode #testInput retournera une nouvelle instance de WATextInputTag. Ensuite, vous utilisez le protocole spécifique de cette brosse pour la configurer : par exemple, vous pourriez envoyer les méthodes #value:, #callback, #liveCallback, #on:of:, etc. Vous n'avez pas besoin d'utiliser de variables temporaires, uniquement des cascades de méthodes :

html textInput
  value: person name;
  callback: [:v | person name: v]

ou

html textInput
  on: #name of: person

ou

html textInput
  on: #name of: person;
  liveCallback: [:r :n | ....]

La troisième étape est d'afficher le contenu ou les enfants (s'il y en a) de ce tag. Faites cela, en passant un objet à afficher (souvent un bloc) à la méthode #with:. Un text input n'en a pas, mais considérons quelque chose comme un tableau :

html tableRow
  rowSpan: 3;
  with: [html tableData with: [html bold with: person name].
         html tableData
              colSpan: 2;
              with: [....]
        ]

Notez que plutôt que d'utiliser #attributeAt:put: avant l'élément, comme dans HtmlRenderer, la modification des attributs fait partie de la phase de configuration - et donc les classe comme WATableRow peuvent implémenter des méthodes pratiques pour les attributs classiques comme #rowSpan: suivant les besoins.

Si aucune configuration n'est nécessaire, il est possible de combiner la première et la troisième étape en utilisant un message avec mot clé à la place d'un message unaire pour spécifier le type de brosse, ce qui est plus compact :

html tableRow
  rowSpan: 3;
  with: [html tableData: [html bold: person name].
         html tableData ....]

Ici, la méthode #tableData: est utilisée à la place d'un appel à #tableData puis à #with:.

Ce style d'API continue de permettre le streaming - le code HTML pour le tag d'ouverture est généré aussitôt que #with: est envoyé. Si #with: n'est jamais envoyé, il est utilisé automatiquement avec un bloc vide quand un nouveau tag est lancé. Ce qui signifie que #with: est la dernière méthode à envoyer, toute configuration ultérieure n'aura aucun effet.

Parfois, une variable temporaire est pratique :

myDiv := html div.
self useSpecialClass ifTrue: [myDiv class: 'specialClass'].
myDiv with: [html text: ....]

Mais gardez à l'esprit que ce sont des objets temporaires - il ne se passera rien de bon si vous les placez dans des variables d'instances et que vous essayez de les utiliser plus tard par exemple.

L'implémentation de Canvas dans les version 2.6a récentes est relativement complète (nous l'utilisons dans un des projets sur lequel je travaille), mais il n'y a aucun doute qu'il reste pleins de trous à combler et de méthodes commode à ajouter, donc, n'hésitez pas à le faire.

Personal tools