domjs-ext
Version:
DOMJS extensions
58 lines (52 loc) • 1.8 kB
JavaScript
;
var d = require('d')
, isObservableValue = require('observable-value/is-observable-value')
, defineProperties = Object.defineProperties
, clear, toDOM, toDOMAttr, getValue, setValue, onNextTick;
clear = function () {
delete this._domInjected;
delete this.toDOM;
delete this.toDOMAttr;
delete this.value;
};
toDOM = function (document) {
clear.call(this);
return this.toDOM.apply(this, arguments);
};
toDOMAttr = function (element, name) {
clear.call(this);
return this.toDOMAttr.apply(this, arguments);
};
getValue = function () {
clear.call(this);
return this.value;
};
setValue = function (nu) {
clear.call(this);
this.value = nu;
};
onNextTick = function () {
if (!this.hasOwnProperty('_domInjected')) return;
clear.call(this);
throw new TypeError("Unconsumed observable\n\n" +
"Possibly result of '_if' (or similar) domjs extension was neither inserted into " +
"any of the DOM elements nor set as an attribute value.\n\n" +
"Results for extensions that return observables must be injected directly into elements " +
"(eventually passthru via 'insert' function). Otherwise they won't be injected automatically " +
"by the view engine (as it's the case with results of base domjs functions.\n\n" +
"Value: " + String(this.value) + "\n" +
"HTML: " + this.toDOM(document).innerHTML);
};
module.exports = function (observable) {
if (!isObservableValue(observable)) return observable;
defineProperties(observable, {
_domInjected: d(false),
toDOM: d(toDOM),
toDOMAttr: d(toDOMAttr),
value: d.gs(getValue, setValue)
});
// Naturally we should use `nextTick`, still it appears as "too fast" for Firefox
// (some DOM rendering is split among event loops)
setTimeout(onNextTick.bind(observable), 0);
return observable;
};