IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

danielhagnoul

Liaison de données, un pas plus loin. Version ES6.

Noter ce billet
par , 16/06/2015 à 21h03 (1328 Affichages)
Référence : Liaison de données en ES5, un pas plus loin.

Construit sur l'acquis des billets précédents, ce billet ne contient que l'essentiel : le code.

Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
const
    kModel = Symbol( 'ObjModel' ),
    kGetType = function( Obj ){
        return Object.prototype.toString.call( Obj ).match( /\s([a-zA-Z]+)/ )[ 1 ].toLowerCase();
    },
    kSetModel = function( Obj ){
 
        if ( kGetType( Obj ) === "object" ){
 
            Obj[ kModel ] = Object.create( Object.prototype );
 
            Object.getOwnPropertyNames( Obj ).forEach( function( key ){
 
                if ( key != kModel ) {
 
                    Object.defineProperty( Obj[ kModel ], key, {
                        "value" : kGetType( Obj[ key ] ),
                        "enumerable" : true
                    });
                }
            });
 
            Object.getOwnPropertySymbols( Obj ).forEach( function( key ){
 
                if ( key != kModel ) {
 
                    Object.defineProperty( Obj[ kModel ], key, {
                        "value" : kGetType( Obj[ key ] ),
                        "enumerable" : true
                    });
                }
            });
 
        } else {
            throw "Erreur dans setModel(), " + Obj + " n'est pas un objet";
        }
    },
    kCreateDOMObject = function( domFragment, keys, boolChildren ){
 
        let
            Obj = Object.create( Object.prototype ),
            nodes = [],
            treeWalker = {},
            bool = boolChildren || false;
 
        if ( kGetType( domFragment ).slice( 0, 4 ) === "html" ) {
 
            treeWalker = document.createTreeWalker(
                domFragment,
                NodeFilter.SHOW_ELEMENT,
                {
                    "acceptNode" : function( node ){
                        if ( bool ) {
                            return NodeFilter.FILTER_ACCEPT;
                        } else if ( node.parentNode === domFragment ) {
                            return NodeFilter.FILTER_ACCEPT;
                        }
 
                        return NodeFilter.FILTER_SKIP;
                    }
                },
                false
            );
 
            while( treeWalker.nextNode() ){
                nodes.push( treeWalker.currentNode );
            }
 
            nodes.forEach( function( item, i ){
                let key = "dom_" + (  keys[ i ] ? keys[ i ] : i );
 
                Object.defineProperty( Obj, key, {
                    "value" : item,
                    "enumerable" : true
                });
            });
        } else {
            alert( "L'objet créé est vide, car le paramètre domFragment ne contient pas un fragment du DOM" );
        }
 
        return Obj;
    };
 
let Formulaire = kCreateDOMObject( document.querySelector( "#formulaire" ), [ "prenom", "choix" ] );
 
Object.defineProperties( Formulaire, {
    "prenom" : {
        "get" : function() {
            return this.dom_prenom.value;
        },
        "set" : function( value ) {
            if ( this[ kModel ].prenom === kGetType( value ) && this.dom_prenom.value != value ){
                this.dom_prenom.value = value;
            }
        },
        "enumerable" : true
    },
    "choix" : {
        "get" : function() {
            return this.dom_choix.value;
        },
        "set" : function( value ) {
            if ( this[ kModel ].choix === kGetType( value ) ){
 
                /*
                 * this.dom_choix.children est un NodeList !
                 * Pas de map() ou de forEach().
                 */ 
                let options = this.dom_choix.children,
                    n = options.length,
                    names = [];
 
                for ( let i = 0; i < n; i++ ) {
                    names.push( options[ i ].value );
                }
 
                if ( names.indexOf( value ) > -1 ){
                    Formulaire.dom_choix.value = value;
                    Formulaire.prenom = value;
                }
            }                
        },
        "enumerable" : true
    }
});
 
// Ajout du modèle de type
kSetModel( Formulaire );
 
console.log( Formulaire );
 
Formulaire.dom_choix.addEventListener( "change", function( ){
    Formulaire.prenom = Formulaire.choix;
}, false );
 
/*
 * Tests
 * 1) Set prenom.
 * 2) Set choix.
 * 3) Set choix avec une valeur incorrecte car
 * inexistante dans les options de l'élément
 * select.
 */    
setTimeout( function(){
    console.log( Formulaire.prenom );
    Formulaire.prenom = "Louis";
}, 10000 );
 
setTimeout( function(){
    Formulaire.choix = "Pierre";
}, 13000 );
 
setTimeout( function(){
    Formulaire.choix = "Jean-Pierre";
}, 15000 );

Envoyer le billet « Liaison de données, un pas plus loin. Version ES6. » dans le blog Viadeo Envoyer le billet « Liaison de données, un pas plus loin. Version ES6. » dans le blog Twitter Envoyer le billet « Liaison de données, un pas plus loin. Version ES6. » dans le blog Google Envoyer le billet « Liaison de données, un pas plus loin. Version ES6. » dans le blog Facebook Envoyer le billet « Liaison de données, un pas plus loin. Version ES6. » dans le blog Digg Envoyer le billet « Liaison de données, un pas plus loin. Version ES6. » dans le blog Delicious Envoyer le billet « Liaison de données, un pas plus loin. Version ES6. » dans le blog MySpace Envoyer le billet « Liaison de données, un pas plus loin. Version ES6. » dans le blog Yahoo

Mis à jour 16/06/2015 à 22h10 par danielhagnoul

Catégories
Javascript , Développement Web

Commentaires