diff --git a/mithril.js b/mithril.js index 0fc8a434..d98d40d5 100644 --- a/mithril.js +++ b/mithril.js @@ -1,5 +1,6 @@ new function() { +var log = console.error.bind(console) var Stream = function(log) { var guid = 0, noop = function() {}, HALT = {} function createStream() { @@ -183,7 +184,7 @@ var Stream = function(log) { }, streams) } return {stream: createStream, merge: merge, combine: combine, reject: reject, HALT: HALT} -}(console.error.bind(console)) +}(log) function Vnode(tag, key, attrs, children, text, dom) { return {tag: tag, key: key, attrs: attrs, children: children, text: text, dom: dom, domSize: undefined, state: {}, events: undefined, instance: undefined} } @@ -664,7 +665,8 @@ var renderService = function($window) { if (old != null) { for (var key in old) { if (attrs == null || !(key in attrs)) { - if (key !== "key") vnode.dom.removeAttribute(key) + if (key[0] === "o" && key[1] === "n" && !isLifecycleMethod(key)) updateEvent(vnode, key, undefined) + else if (key !== "key") vnode.dom.removeAttribute(key) } } } @@ -711,8 +713,10 @@ var renderService = function($window) { var eventName = key.slice(2) if (vnode.events === undefined) vnode.events = {} if (vnode.events[key] != null) element.removeEventListener(eventName, vnode.events[key], false) - vnode.events[key] = callback - element.addEventListener(eventName, vnode.events[key], false) + if (typeof value === "function") { + vnode.events[key] = callback + element.addEventListener(eventName, vnode.events[key], false) + } } } //lifecycle @@ -784,13 +788,14 @@ var buildQueryString = function(object) { else args.push(encodeURIComponent(key) + (value != null && value !== "" ? "=" + encodeURIComponent(value) : "")) } } -var requestService = function($window) { +var requestService = function($window, log) { + var Stream1 = Stream(log) var callbackCount = 0 var oncompletion function setCompletionCallback(callback) {oncompletion = callback} function xhr(args) { - var stream = Stream.stream() + var stream = Stream1.stream() if (args.initialValue !== undefined) stream(args.initialValue) var useBody = typeof args.useBody === "boolean" ? args.useBody : args.method !== "GET" && args.method !== "TRACE" @@ -841,7 +846,7 @@ var requestService = function($window) { return stream } function jsonp(args) { - var stream = Stream.stream() + var stream = Stream1.stream() if (args.initialValue !== undefined) stream(args.initialValue) var callbackName = args.callbackName || "_mithril_" + Math.round(Math.random() * 1e16) + "_" + callbackCount++ @@ -904,7 +909,7 @@ var requestService = function($window) { } return {xhr: xhr, jsonp: jsonp, setCompletionCallback: setCompletionCallback} -}(window) +}(window, log) var redrawService = function() { var callbacks = [] function unsubscribe(callback) { diff --git a/mithril.min.js b/mithril.min.js index 30736343..de9b75be 100644 --- a/mithril.min.js +++ b/mithril.min.js @@ -1,41 +1,41 @@ -new function(){function y(){function a(){0=r&&B>=A;){var t=c[r],w=f[A];if(t===w)r++,A++;else if(null!=t&&null!=w&&t.key=== -w.key)r++,A++,q(a,t,w,e,m(c,r,h),z,k),z&&t.tag===w.tag&&g(a,l(t),h);else if(t=c[v],t===w)v--,A++;else if(null!=t&&null!=w&&t.key===w.key)q(a,t,w,e,m(c,v+1,h),z,k),A=r&&B>=A;){t=c[v];w=f[B];if(t===w)v--;else if(null!=t&&null!=w&&t.key===w.key)q(a,t,w,e,m(c,v+1,h),z,k),z&&t.tag===w.tag&&g(a,l(t),h),null!=t.dom&&(h=t.dom),v--;else{if(!u){u=c;var t=v,n={},x;for(x=0;xa.indexOf("?")?"?":"&";a+=h+d}return a}function e(a){try{return""!== -a?JSON.parse(a):null}catch(b){throw Error(a);}}function k(a){return a.responseText}function q(a,b){if("function"===typeof a)if(b instanceof Array)for(var d=0;dh.status)p(q(g.type,a));else{var b=Error(h.responseText),d;for(d in a)b[d]=a[d];p.error(b)}}catch(e){p.error(e)}"function"===typeof m&&m()}};l?h.send(g.data):h.send();return p},jsonp:function(g){var e=C.stream();void 0!==g.initialValue&&e(g.initialValue);var k=g.callbackName||"_mithril_"+ -Math.round(1E16*Math.random())+"_"+l++,h=a.document.createElement("script");a[k]=function(b){h.parentNode.removeChild(h);e(q(g.type,b));"function"===typeof m&&m();delete a[k]};h.onerror=function(){h.parentNode.removeChild(h);e.error(Error("JSONP request failed"));"function"===typeof m&&m();delete a[k]};null==g.data&&(g.data={});g.url=b(g.url,g.data);g.data[g.callbackKey||"callback"]=k;h.src=d(g.url,g.data);a.document.documentElement.appendChild(h);return e},setCompletionCallback:function(a){m=a}}}(window), -H=function(){var a=[];return{subscribe:a.push.bind(a),unsubscribe:function(b){b=a.indexOf(b);-1=l&&A>=k;){var y=a[l],q=d[k];if(y===q)l++,k++;else if(null!=y&&null!=q&&y.key===q.key)l++,k++,h(c,y,q,b,t(a,l,g),m,f),m&&y.tag===q.tag&&r(c,n(y),g);else if(y=a[z],y===q)z--,k++;else if(null!=y&&null!=q&&y.key===q.key)h(c,y,q,b,t(a,z+1,g),m,f),k=l&&A>=k;){y=a[z];q=d[A];if(y===q)z--;else if(null!=y&&null!=q&& +y.key===q.key)h(c,y,q,b,t(a,z+1,g),m,f),m&&y.tag===q.tag&&r(c,n(y),g),null!=y.dom&&(g=y.dom),z--;else{if(!w){w=a;var y=z,v={},u;for(u=0;ub.indexOf("?")?"?":"&";b+=m+f}return b}function k(b){try{return""!==b?JSON.parse(b):null}catch(e){throw Error(b);}}function h(b){return b.responseText}function n(b,e){if("function"===typeof b)if(e instanceof Array)for(var f= +0;fm.status)e(n(g.type,b));else{var f=Error(m.responseText),r;for(r in b)f[r]=b[r];e.error(f)}}catch(k){e.error(k)}"function"===typeof x&&x()}};r?m.send(g.data):m.send();return e},jsonp:function(e){var l=t.stream();void 0!==e.initialValue&&l(e.initialValue);var k=e.callbackName||"_mithril_"+Math.round(1E16*Math.random())+"_"+r++,m=b.document.createElement("script");b[k]=function(f){m.parentNode.removeChild(m);l(n(e.type, +f));"function"===typeof x&&x();delete b[k]};m.onerror=function(){m.parentNode.removeChild(m);l.error(Error("JSONP request failed"));"function"===typeof x&&x();delete b[k]};null==e.data&&(e.data={});e.url=p(e.url,e.data);e.data[e.callbackKey||"callback"]=k;m.src=f(e.url,e.data);b.document.documentElement.appendChild(m);return l},setCompletionCallback:function(b){x=b}}}(window,u),G=function(){var b=[];return{subscribe:b.push.bind(b),unsubscribe:function(e){e=b.indexOf(e);-1