Data binding example. Makes a link between items, so changing data in one item changes every linked items' data.
A Pen by Karri Rasinmäki on CodePen.
Data binding example. Makes a link between items, so changing data in one item changes every linked items' data.
A Pen by Karri Rasinmäki on CodePen.
<h1>Data Binder</h1> | |
<h4>Data binding example. Makes a link between items, so changing data in one item changes every linked items' data.</h4> | |
<hr> | |
<label for="name">Name:</label> | |
<input type="text" name="name" value="" class="nameBind"> | |
<br> | |
Your name is <b class="nameBind"></b> | |
<br><br> | |
<label>Let's test our data binding with text area</label><br> | |
<textarea class="textareaBind"></textarea><br> | |
Your story is supposed to appear under here: | |
<div class="textareaBind"></div> | |
<br> |
var DataBinder = { | |
// This stores connected items in lists | |
connect: function(items) { | |
return new DataBinder.Connection(items); | |
} | |
}; | |
DataBinder.Connection = function(items) { | |
this.items = []; | |
this.connect(items); | |
this._value = ""; | |
}; | |
DataBinder.Connection.prototype = { | |
// Define setter and getter for "value" | |
// to ensure connection update on value change | |
get value() { return this._value; }, | |
set value(v) { this.updateConnection(v); }, | |
// Set connection item value | |
setValue: function setValueFn(item, value) { | |
if(item.nodeName !== undefined) { | |
if(item.value !== undefined) item.value = value; | |
else item.textContent = value; | |
} | |
}, | |
// Updates connection items with new value | |
updateConnection: function updateConnectionFn(newValue) { | |
var items = this.items; | |
for(var i=items.length-1; i>=0; --i) { | |
this.setValue(items[i], newValue); | |
} | |
this._value = newValue; | |
}, | |
// Listens for value change | |
handleEvent: function listenerFn(e) { | |
this.updateConnection(e.srcElement.value); | |
}, | |
addListener: function addListenerFn(item) { | |
if(item.nodeName !== undefined) { | |
item.addEventListener("input", this, false); | |
item.addEventListener("change", this, false); | |
} | |
}, | |
// Connect items to connection | |
connect: function connectFn(items) { | |
var _items = this.items; | |
for(var i=items.length-1; i>=0; --i) { | |
var a = items[i]; | |
if(a === undefined || a === null) continue; | |
// Add listener | |
this.addListener(a); | |
_items.push(a); | |
} | |
} | |
}; | |
// Make new connection between these elements | |
// and stores connection to var | |
// Now connection.value holds value of connection | |
var nameConn = DataBinder.connect(document.getElementsByClassName("nameBind")); | |
var textareaConn = DataBinder.connect(document.getElementsByClassName("textareaBind")); | |
// Changing connection value calls connection update | |
textareaConn.value = "Hello!"; | |
// You can also add more items to connection later | |
var newItem = document.createElement("input"); | |
newItem.type = "text"; | |
document.body.appendChild(newItem); | |
nameConn.connect([newItem]); |