html5 bind,GitHub - remy/bind.js: bind.js - simple two way data binding to HTML and callbacks

Bind.js

Two way data binding for HTML and JavaScript (with node.js compatibility) with additional support for transforming data before it arrives in the DOM.

68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f62696e642e6a7368747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f72656d792f62696e642e6a732f4532452532306f6e2532304368726f6d6568747470733a2f2f696d672e736869656c64732e696f2f636f766572616c6c732f6769746875622f72656d792f62696e642e6a73

Demos

Form elements - comprehensive demo of two-way binding with different form elements

Hangman game - more involved example of data binding

Simple one to one binding - time & modulus bound to simple elements

Two way binding - value updates on interval, and DOM updates with it

Prerequisites

setters/gettings, fn.bind, qSA (if using selectors), getOwnPropertyNames.

Usage

Create a new Bind based on an object and a mapping. The mapping uses a key/value pair of property path to handler. The handler can be a CSS selector (and thus updates the DOM) or a callback.

There is also an advanced value that allows finer grain control over the binding (seen in the skills value in the example below).

Browser version can be downloaded from releases or via a CDN like unpkg: https://unpkg.com/bind.js/dist/bind.min.js

The node version can be installed using npm install -S bind.js.

var player = Bind({

name: '@rem',

score: 11,

location: {

city: 'Brighton',

country: 'England'

},

skills: [

'code',

'chicken',

'shortness'

]

}, {

score: '#score',

name: '#name',

'location.city': function (city) {

alert(this.name + "'s city is " + city);

},

skills: {

dom: '#skills',

transform: function (value) {

return '

' + this.safe(value) + '';

},

}

});

document.querySelector('form').onsubmit = function (event) {

event.preventDefault();

player.skills.push(document.querySelector('#newSkill').value);

this.reset();

};

Notice that in the second argument to Bind the mapping key is a path to the object property separated by a . period: 'location.city': function.

Mapping values

Mapping values can be:

String: a CSS expression

Function: a callback that receives the new value

Object: see below

If the mapping value is an object, all the following properties are supported:

dom: a string CSS expression

callback: a function

transform: a function that receives the new value, and returns the HTML that will be set to the DOM.

parse: a function that receives the changed value from the DOM and returns the value that will be set in the JavaScript object

Note that the transform function is applied to array elements when mapped to an array, and so does not receive the entire array. This is to allow control over updating lists in the DOM (see the example above).

Arrays

Individual array elements can be also mapped using the dot notation and the index in the array.

In the example below, when the first cat name in the array changes, it will update the DOM.

var data = Bind({

cats: ['ninja', 'missy', 'dizzy']

}, {

cats: {

dom: 'ul',

transform: function (name) {

return '

' + name + '';

}

},

'cats.0': '#first-cat'

});

// later let's add Sam to the cats

data.cats.unshift('sam');

Using the DOM to inform values

If you want the DOM to drive the initial values of the bind object, then you'll need to set the JavaScript property value to null and it will read the value from the DOM at startup:

var data = Bind({

price: null

}, {

price: '.price',

});

Now in the HTML:

£10.50

Now data.price has the value of £10.50. If you wanted this to be a float instead, you would use the parse and transform methods:

var data = Bind({

price: null

}, {

price: {

dom: '.price',

parse: function (v) {

return parseFloat(v.replace(/^£/, ''), 10);

},

transform: function (v) {

return '£' + v.toFixed(2);

}

});

Now data.price is 10.5, and when the value is changed to data.price = 11.5, the DOM is updated to £11.50.

Restrictions

Deleting primitive property

There's no handling deleted primitive properties. Once it is deleted, if it's added back in again, it can't be tracked:

data.me.score++; // updates element#score

delete data.me.score;

data.me.score = 1; // does nothing

// A work around is to restore the property object, the following

// re-uses the bind map, and updates element#score again

data.me = {

score: 1,

// ... etc

};

Events at the root object

This isn't currently supported, but could be implemented with a special mapping - I'm open to suggestions here.

Otherwise, the object can be nested and callbacks be bound to the first depth property (as seen in the forms example)

Exporting

If the original, unbound object is needed, a utility function is available on the root object:

var copy = data.__export();

License

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值