-
Notifications
You must be signed in to change notification settings - Fork 1
/
wagner.ko.js
67 lines (56 loc) · 1.36 KB
/
wagner.ko.js
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
var ko = require('knockout')
, mapping = require('./ko-mapping')
ko.bindingHandlers.state = {
update: function(ele, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var allBindings = allBindingsAccessor()
, $ele = $(ele)
if(allBindingsAccessor.allStates) {
$ele.removeClass(allBindingsAccessor.allStates.join(' '))
}
$ele.addClass(ko.utils.unwrapObservable(valueAccessor()))
}
}
function knockoutDataBinder(options) {
var handlers = {}
, root = this._root
, viewModel
, wasApplied
options = options || {}
function ensureBindings() {
if(wasApplied) return
ko.applyBindings(viewModel, root)
wasApplied = true
}
function createViewModel(obj) {
if(options.bindMapping) {
viewModel = mapping.fromJS(obj, options.bindMapping)
} else {
viewModel = mapping.fromJS(obj)
}
}
function ensureViewModel(schema) {
if(!viewModel) {
if(options.bindWith) {
createViewModel(options.bindWith)
} else {
createViewModel(schema)
}
}
}
function update(values) {
ensureViewModel(values)
mapping.fromJS(values, viewModel)
ensureBindings()
}
this.update = update
return this
}
knockoutDataBinder.arr = function() {
return ko.observableArray()
}
knockoutDataBinder.obj = function(val) {
return ko.observable(val)
}
module.exports = knockoutDataBinder
module.exports.ko = ko
module.exports.mapping = mapping