diff -r 094cd25a16d9 -r 83f4aa79c130 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java Sat Apr 13 09:14:54 2013 +0200 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java Sun Apr 14 11:52:36 2013 +0200 @@ -66,12 +66,33 @@ this.model = model == null ? this : model; } + public Object koData() { + return model; + } + + private static final JSObject KObject; + static { + KObject = (JSObject) web().executeScript( + "(function(scope) {" + + " var kCnt = 0; " + + " scope.KObject = {};" + + " scope.KObject.create= function(value) {" + + " var cnt = ++kCnt;" + + " var ret = {};" + + " ret.toString = function() { return 'KObject' + cnt + ' value: ' + value; };" + + " return ret;" + + " };" + + "})(window); window.KObject" + ); + } + public static Knockout applyBindings( Object model, String[] propsGettersAndSetters, String[] methodsAndSignatures ) { - applyImpl(propsGettersAndSetters, model.getClass(), model, model, methodsAndSignatures); - return new Knockout(model); + Object bindings = KObject.call("create", model); + applyImpl(propsGettersAndSetters, model.getClass(), bindings, model, methodsAndSignatures); + return new Knockout(bindings); } public static Knockout applyBindings( Class modelClass, M model, String[] propsGettersAndSetters, @@ -80,7 +101,7 @@ Object bindings = next; next = null; if (bindings == null) { - bindings = web().executeScript("new Object()"); + bindings = KObject.call("create", model); } applyImpl(propsGettersAndSetters, modelClass, bindings, model, methodsAndSignatures); applyBindings(bindings); @@ -128,13 +149,23 @@ + " read: function() {" + " try {" + " var v = model[getter]();" - + " try { v = v.koData(); } catch (ignore) {};" + + " console.log(\" getter value \" + v + \" for property \" + prop);" + + " try { v = v.koData(); } catch (ignore) {" + + " console.log(\"Cannot convert to koData: \" + ignore);" + + " };" + + " console.log(\" getter ret value \" + v);" + + " for (var pn in v) {" + + " console.log(\" prop: \" + pn + \" + in + \" + v + \" = \" + v[pn]);" + + " if (typeof v[pn] == \"function\") console.log(\" its function value:\" + v[pn]());" + + " }" + + " console.log(\" all props printed for \" + (typeof v));" + " return v;" + " } catch (e) {" + " alert(\"Cannot call \" + getter + \" on \" + model + \" error: \" + e);" + " }" + " }," - + " owner: bindings" + + " owner: bindings," + + " deferEvaluation: true" + "};" + "if (setter != null) {" + " bnd.write = function(val) {" @@ -148,9 +179,9 @@ try { KOProperty kop = new KOProperty(model, strip(getter), strip(setter)); bnd.call("bnd", ko, bindings, kop, prop, "get", "set", primitive, array); - LOG.log(Level.FINE, "binding defined for {0}: {1}", new Object[]{prop, ((JSObject)bindings).getMember(prop)}); + LOG.log(Level.INFO, "binding defined for {0}: {1}", new Object[]{prop, ((JSObject)bindings).getMember(prop)}); } catch (Throwable ex) { - LOG.log(Level.FINE, "binding failed for {0} on {1}", new Object[]{prop, bindings}); + LOG.log(Level.INFO, "binding failed for {0} on {1}", new Object[]{prop, bindings}); } }