Demo
Basic text-interpolationt
User name is {first} {last}, works at {company}
<div>User name is {first} {last}, works at {company}</div>
text interpolation by function
Tags:
{showTags()}
<div>Tags: <code>{showTags()}</code></div>
text interpolation with build in filter
Balance with decimal: {balance | currency true}
<div>Balance with decimal: {balance | currency true}</div>
attribute interpolation
Feed back at {email}
<img data-src="{picture}" alt="picture"/>
<p>Feed back at <a data-href="mailto:{email}?subject=feedback">{email}</a></p>
data-html
<p> data-html="about"></p>
data-render
<div data-render="renderCounter"></div>
renderCounter: function (model, node) {
if (!this.counter) {
var counter = this.counter = new Counter
node.appendChild(counter.el)
counter.digits(5)
counter.update(model.balance)
} else {
this.counter.update(model.balance)
}
}
event handler
{address}
<div><input type="text" name="address" on-input="update" data-value="{address}"/></div>
update: function (e, model, node) {
var attr = node.getAttribute('name')
var val = node.value
if (attr in model) {
model[attr] = val
}
}
Custom binding
<div><span moment="registered" format="MMM Do YY"></span></div>
moment: function (attr) {
this.bind(attr, function (model, node) {
var format = node.getAttribute('format')
node.textContent = moment(model[attr]).format(format)
})
}
Custom filter
Longitude: {longitude | integer}, latitude: {latitude | integer}
<div> Longitude: {longitude | integer}, latitude: {latitude | integer} </div>
integer: function (val) {
if (!val) return 0
return parseInt(val, 10)
}
Javascript code
var User = Model('User')
var user = new User(attrs)
user.showTags = function () {
return this.tags.join(',')
}
var delegate = {
update: function (e, model, node) {
var attr = node.getAttribute('name')
var val = node.value
if (attr in model) {
model[attr] = val
}
},
renderCounter: function (model, node) {
if (!this.counter) {
var counter = this.counter = new Counter
node.appendChild(counter.el)
counter.digits(5)
counter.update(model.balance)
} else {
this.counter.update(model.balance)
}
}
}
var bindings = {
moment: function (attr) {
this.bind(attr, function (model, node) {
var format = node.getAttribute('format')
node.textContent = moment(model[attr]).format(format)
})
}
}
var filters = {
integer: function (val) {
if (!val) return 0
return parseInt(val, 10)
}
}
var el = document.getElementById('user')
Reactive(el, user, {
delegate: delegate,
bindings: bindings,
filters: filters
})