Hello, world
Nous allons commencer par définir une View
très simple qui se contente d'adresser nos salutations.
Créons notre View
Commençons ! Ouvrez driver.js
et ajoutez le code suivant :
var Marionette = require('backbone.marionette'); // 1
var HelloWorld = Marionette.LayoutView.extend({ // 2
el: '#app-hook', // 3
template: require('./templates/layout.html') // 4
});
var hello = new HelloWorld(); // 5
hello.render(); // 6
Ensuite, nous créons un fichier dans le dossier templates
appelé layout.html
et le définissons ainsi :
<p>Hello, world!</p>
todo Ajoutez à browserify dans
package.json
une transform pour les templates underscorenpm install --save-dev node-underscorify
"build": "./node_modules/browserify/bin/cmd.js -t node-underscorify app/driver.js -o static/js/app.js"
Que cela signifie t-il ?
Le fichier template lui-même est plutôt compréhensible, intéressons-nous à driver.js
:
- Import de Marionette
- Création d'une nouvelle typoe de
View
nomméeHelloWorld
qui provient d'une extension de MarionetteLayoutView
. Nous entrerons dans plus de détails dans un moment. - Nous attachons la vue à un élément du DOM. Il s'agit en fait d'un sélecteur jQuery, nous pouvons utiliser à cet endroit n'importe quel selecteur jQuery valide.
- Nous devons définir un template à afficher à nos utilisateurs.
- Nous devons créer une instance de notre classe
HelloWorld
avant de pouvoir faire quoique ce soit d'utile avec. - Désormais la parade commence ! Nous appelons la méthode
render()
pour afficher le template à l'écran.
Lancer la compilation
Après avoir compilé le résultat, rendez-vous depuis votre navigateur sur l'URL index.html
pour observer l'affichage produit.
Vous venez de construire votre première application Javascript avec Marionette
!
Construire une application de taches
Désormais, nous avons une View
, faisons quelque chose d'un peu plus intéressant en restituant une liste prédéfinie de taches. Nous allons avoir besoin d'un Backbone Model
pour sauvegarder la liste de telle façon que que notre LayoutView
puisse y accéder. Ré-ouvrez notre fichier driver.js
:
// FIXME Expose underscore as global
_ = require( "underscore" );
var Backbone = require('backbone');
var Marionette = require('backbone.marionette');
var TodoList = Marionette.LayoutView.extend({
el: '#app-hook',
template: require('./templates/layout.html'),
initialize: function() {
this.model = new Backbone.Model({
items: [
{assignee: 'Scott', text: 'Write a book about Marionette'},
{assignee: 'Andrew', text: 'Do some coding'}
]
});
}
});
var todo = new TodoList();
todo.render();
Le point central de cette modification tient l'insertion d'un objet en une instance de Backbone.Model
. Les modèles Backbone s'intègrent aisément avec les templates, conférant un accès simple à la source de données. Nous verrons dans plusieurs chapitres à quel point les modèles peuvent être puissants en ce qui concerne nos vues.
Modifions notre fichier templates/layout.html
pour prendre avantage de ce changement :
<ul>
<% _.each(items, function(item) { %>
<li><%- item.text %> — <%- item.assignee %>
<% }) %>
</ul>
Nous utilisons le moteur de template Underscore pour restituer notre liste d'éléments. Vous devriez obtenir une liste de deux éléments. Nous avons désormais une liste rendue dans la page, mais cela semble un peu maladroit. Qu'arrive t-il si nous souhaitons ajouter ou supprimer des entrées à cette liste ?
Collections
and CollectionViews
Notre liste d'entrées correspond vraiment à une collection, nous allons donc utiliser une Backbone.Collection
pour la modéliser. Nous allons également utiliser une vue se spécialisant dans la restituion de liste de données -
la CollectionView
. Retour à notre fichier driver.js
, nous allons utiliser plusieurs vues :
// FIXME Expose underscore as global
_ = require( "underscore" );
var Backbone = require('backbone');
var Marionette = require('backbone.marionette');
var ToDo = Marionette.LayoutView.extend({
tagName: 'li',
template: './templates/todoitem.html'
});
var TodoList = Marionette.CollectionView.extend({
el: '#app-hook',
tagName: 'ul',
childView: ToDo,
initialize: function() {
this.collection = new Backbone.Collection([
{assignee: 'Scott', text: 'Write a book about Marionette'},
{assignee: 'Andrew', text: 'Do some coding'}
]);
}
});
var todo = new TodoList();
todo.render();
La première chose que nous avoins fait, est d'ajouter une nouvelle vue et de la relier à une
CollectionView
en utilisant l'attribut childView
. Nous avons également modifié la propriété
this.model
pour this.collection
au sein de la méthode initialize
de notre nouvelle CollectionView
et supprimé la clé items
.
La CollectionView
est une vue qui parcoure this.collection
et restitue une instance de son attribut childView
pour chacune des entrées trouvées. Nous avons supprimé la propriété template
car la CollectionView
n'a plus de template en soi.
Dans templates/todoitem.html
nous avons simplement :
<%- text %> — <%- assignee %>
C'est tout ! Marionette sait comment construire l'enveloppe des éléments ul
et li
et insère les données de l'itération pour nous. Encore mieux, si nous voulions ajouter/supprimer des entrées de la collecion, CollectionView
le repère et le restitue automatiquement pour nous.
Dans le prochain chapitre, nous allons ajouter de nouvelles entrées à cette collection, de telle manière à garder l'état de notre liste de taches.