1.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java Sun Apr 14 11:51:58 2013 +0200
1.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java Sun Apr 14 11:52:36 2013 +0200
1.3 @@ -165,7 +165,9 @@
1.4 }
1.5 if (toKO != null) {
1.6 try {
1.7 + Object prev = arr[i];
1.8 arr[i] = toKO.invoke(arr[i]);
1.9 + LOG.log(Level.INFO, "{0}th element {1} replaced by {2}", new Object[]{i, prev, arr[i]});
1.10 } catch (IllegalAccessException | InvocationTargetException ex) {
1.11 LOG.log(Level.SEVERE, "Problems invoking koData on " + arr[i], ex);
1.12 }
2.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOProperty.java Sun Apr 14 11:51:58 2013 +0200
2.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOProperty.java Sun Apr 14 11:52:36 2013 +0200
2.3 @@ -51,6 +51,7 @@
2.4 }
2.5
2.6 public void set(Object value) throws Exception {
2.7 + LOG.log(Level.INFO, "{0} set to {1}", new Object[] { setter, value });
2.8 setter.invoke(obj, value);
2.9 }
2.10 }
3.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java Sun Apr 14 11:51:58 2013 +0200
3.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/Knockout.java Sun Apr 14 11:52:36 2013 +0200
3.3 @@ -66,12 +66,33 @@
3.4 this.model = model == null ? this : model;
3.5 }
3.6
3.7 + public Object koData() {
3.8 + return model;
3.9 + }
3.10 +
3.11 + private static final JSObject KObject;
3.12 + static {
3.13 + KObject = (JSObject) web().executeScript(
3.14 + "(function(scope) {"
3.15 + + " var kCnt = 0; "
3.16 + + " scope.KObject = {};"
3.17 + + " scope.KObject.create= function(value) {"
3.18 + + " var cnt = ++kCnt;"
3.19 + + " var ret = {};"
3.20 + + " ret.toString = function() { return 'KObject' + cnt + ' value: ' + value; };"
3.21 + + " return ret;"
3.22 + + " };"
3.23 + + "})(window); window.KObject"
3.24 + );
3.25 + }
3.26 +
3.27 public static <M> Knockout applyBindings(
3.28 Object model, String[] propsGettersAndSetters,
3.29 String[] methodsAndSignatures
3.30 ) {
3.31 - applyImpl(propsGettersAndSetters, model.getClass(), model, model, methodsAndSignatures);
3.32 - return new Knockout(model);
3.33 + Object bindings = KObject.call("create", model);
3.34 + applyImpl(propsGettersAndSetters, model.getClass(), bindings, model, methodsAndSignatures);
3.35 + return new Knockout(bindings);
3.36 }
3.37 public static <M> Knockout applyBindings(
3.38 Class<M> modelClass, M model, String[] propsGettersAndSetters,
3.39 @@ -80,7 +101,7 @@
3.40 Object bindings = next;
3.41 next = null;
3.42 if (bindings == null) {
3.43 - bindings = web().executeScript("new Object()");
3.44 + bindings = KObject.call("create", model);
3.45 }
3.46 applyImpl(propsGettersAndSetters, modelClass, bindings, model, methodsAndSignatures);
3.47 applyBindings(bindings);
3.48 @@ -128,13 +149,23 @@
3.49 + " read: function() {"
3.50 + " try {"
3.51 + " var v = model[getter]();"
3.52 - + " try { v = v.koData(); } catch (ignore) {};"
3.53 + + " console.log(\" getter value \" + v + \" for property \" + prop);"
3.54 + + " try { v = v.koData(); } catch (ignore) {"
3.55 + + " console.log(\"Cannot convert to koData: \" + ignore);"
3.56 + + " };"
3.57 + + " console.log(\" getter ret value \" + v);"
3.58 + + " for (var pn in v) {"
3.59 + + " console.log(\" prop: \" + pn + \" + in + \" + v + \" = \" + v[pn]);"
3.60 + + " if (typeof v[pn] == \"function\") console.log(\" its function value:\" + v[pn]());"
3.61 + + " }"
3.62 + + " console.log(\" all props printed for \" + (typeof v));"
3.63 + " return v;"
3.64 + " } catch (e) {"
3.65 + " alert(\"Cannot call \" + getter + \" on \" + model + \" error: \" + e);"
3.66 + " }"
3.67 + " },"
3.68 - + " owner: bindings"
3.69 + + " owner: bindings,"
3.70 + + " deferEvaluation: true"
3.71 + "};"
3.72 + "if (setter != null) {"
3.73 + " bnd.write = function(val) {"
3.74 @@ -148,9 +179,9 @@
3.75 try {
3.76 KOProperty kop = new KOProperty(model, strip(getter), strip(setter));
3.77 bnd.call("bnd", ko, bindings, kop, prop, "get", "set", primitive, array);
3.78 - LOG.log(Level.FINE, "binding defined for {0}: {1}", new Object[]{prop, ((JSObject)bindings).getMember(prop)});
3.79 + LOG.log(Level.INFO, "binding defined for {0}: {1}", new Object[]{prop, ((JSObject)bindings).getMember(prop)});
3.80 } catch (Throwable ex) {
3.81 - LOG.log(Level.FINE, "binding failed for {0} on {1}", new Object[]{prop, bindings});
3.82 + LOG.log(Level.INFO, "binding failed for {0} on {1}", new Object[]{prop, bindings});
3.83 }
3.84 }
3.85
4.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Sun Apr 14 11:51:58 2013 +0200
4.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Sun Apr 14 11:52:36 2013 +0200
4.3 @@ -193,7 +193,7 @@
4.4 w.append("import org.apidesign.bck2brwsr.htmlpage.api.*;\n");
4.5 w.append("import org.apidesign.bck2brwsr.htmlpage.KOList;\n");
4.6 w.append("import org.apidesign.bck2brwsr.core.JavaScriptOnly;\n");
4.7 - w.append("final class ").append(className).append(" implements Cloneable {\n");
4.8 + w.append("public final class ").append(className).append(" implements Cloneable {\n");
4.9 w.append(" private boolean locked;\n");
4.10 w.append(" private org.apidesign.bck2brwsr.htmlpage.Knockout ko;\n");
4.11 w.append(body.toString());
4.12 @@ -279,6 +279,9 @@
4.13 w.append(" };\n");
4.14 writeToString(props, w);
4.15 writeClone(className, props, w);
4.16 + w.append(" public Object koData() {\n");
4.17 + w.append(" return ko.koData();\n");
4.18 + w.append(" }\n");
4.19 w.append("}\n");
4.20 } finally {
4.21 w.close();