La liaison bidirectionnelle signifie que toutes les modifications liées aux données affectant le modèle sont immédiatement propagées à la ou aux vues correspondantes, et que toutes les modifications apportées à la ou aux vues (par exemple, par l'utilisateur) sont immédiatement reflétées dans le modèle sous-jacent. . Lorsque les données de l'application changent, l'interface utilisateur change également, et inversement.
Il s'agit d'un concept très solide pour créer une application Web, car il fait de l'abstraction «Modèle» une source de données atomique sûre à utiliser partout dans l'application. Disons que si un modèle, lié à une vue, change, alors sa partie d'interface utilisateur correspondante (la vue) reflétera cela, quoi qu'il arrive . Et l'élément d'interface utilisateur correspondant (la vue) peut être utilisé en toute sécurité comme un moyen de collecter des entrées / données utilisateur, afin de maintenir les données d'application à jour.
Une bonne implémentation de liaison bidirectionnelle devrait évidemment rendre cette connexion entre un modèle et une ou plusieurs vues aussi simple que possible, du point de vue du développeur.
Il est alors tout à fait faux de dire que Backbone ne prend pas en charge la liaison bidirectionnelle: bien que ce ne soit pas une fonctionnalité principale du framework, cela peut être effectué tout simplement en utilisant les événements de Backbone. Cela coûte quelques lignes de code explicites pour les cas simples; et peut devenir assez dangereux pour des fixations plus complexes. Voici un cas simple (code non testé, écrit à la volée juste à titre d'illustration):
Model = Backbone.Model.extend
defaults:
data: ''
View = Backbone.View.extend
template: _.template("Edit the data: <input type='text' value='<%= data %>' />")
events:
# Listen for user inputs, and edit the model.
'change input': @setData
initialize: (options) ->
# Listen for model's edition, and trigger UI update
@listenTo @model, 'change:data', @render
render: ->
@$el.html @template(@model.attributes)
@
setData: (e) =>
e.preventDefault()
@model.set 'data', $(e.currentTarget).value()
model: new Model()
view = new View {el: $('.someEl'), model: model}
Il s'agit d'un modèle assez typique dans une application Backbone brute. Comme on peut le voir, cela nécessite une quantité décente de code (assez standard).
AngularJS et quelques autres alternatives ( Ember , Knockout …) fournissent une liaison bidirectionnelle en tant que fonctionnalité de premier citoyen. Ils résument de nombreux cas limites sous certains DSL et font de leur mieux pour intégrer la liaison bidirectionnelle dans leur écosystème. Notre exemple ressemblerait à quelque chose comme ça avec AngularJS (code non testé, voir ci-dessus):
<div ng-app="app" ng-controller="MainCtrl">
Edit the data:
<input name="mymodel.data" ng-model="mymodel.data">
</div>
angular.module('app', [])
.controller 'MainCtrl', ($scope) ->
$scope.mymodel = {data: ''}
Plutôt court!
Mais sachez que certaines extensions de liaison bidirectionnelle à part entière existent également pour Backbone (par ordre brut et subjectif de complexité décroissante): Epoxy , Stickit , ModelBinder …
Une chose intéressante avec Epoxy, par exemple, est qu'il vous permet de déclarer vos liaisons (attributs de modèle <-> élément DOM de la vue) soit dans le modèle (DOM), soit dans l'implémentation de la vue (JavaScript). Certaines personnes n'aiment pas du tout ajouter des "directives" au DOM / modèle (comme les attributs ng- * requis par AngularJS, ou les attributs de liaison de données d'Ember).
En prenant Epoxy comme exemple, on peut retravailler l'application Backbone brute en quelque chose comme ça (…):
Model = Backbone.Model.extend
defaults:
data: ''
View = Backbone.Epoxy.View.extend
template: _.template("Edit the data: <input type='text' />")
# or, using the inline form: <input type='text' data-bind='value:data' />
bindings:
'input': 'value:data'
render: ->
@$el.html @template(@model.attributes)
@
model: new Model()
view = new View {el: $('.someEl'), model: model}
Dans l'ensemble, presque tous les frameworks JS "grand public" prennent en charge la liaison bidirectionnelle. Certains d'entre eux, tels que Backbone, nécessitent un travail supplémentaire pour le faire fonctionner correctement , mais ce sont les mêmes qui n'imposent pas une manière spécifique de le faire, pour commencer. Il s'agit donc vraiment de votre état d'esprit.
En outre, vous pourriez être intéressé par Flux , une architecture différente pour les applications Web promouvant la liaison unidirectionnelle via un motif circulaire. Il est basé sur le concept de re-rendu rapide et holistique des composants de l'interface utilisateur lors de tout changement de données pour assurer la cohésion et faciliter le raisonnement sur le code / flux de données. Dans la même tendance, vous voudrez peut-être vérifier le concept de MVI (Model-View-Intent), par exemple Cycle .