Push values of chagned properties rather than letting the browser to callback for them
1.1 --- a/ko-fx/src/main/java/org/apidesign/html/kofx/FXContext.java Fri Sep 13 10:17:21 2013 +0200
1.2 +++ b/ko-fx/src/main/java/org/apidesign/html/kofx/FXContext.java Fri Sep 13 11:04:17 2013 +0200
1.3 @@ -198,18 +198,26 @@
1.4 public void run() {
1.5 List<JSObject> objs = new ArrayList<JSObject>();
1.6 List<String> strngs = new ArrayList<String>();
1.7 + List<Object> values = new ArrayList<Object>();
1.8 synchronized (this) {
1.9 for (Map.Entry<Combo, Set<String>> entry : notifyMutated.entrySet()) {
1.10 - for (String propertyName : entry.getValue()) {
1.11 - objs.add(entry.getKey().js);
1.12 - strngs.add(propertyName);
1.13 + Combo changed = entry.getKey();
1.14 + Set<String> changedProps = entry.getValue();
1.15 + for (PropertyBinding pb : changed.props) {
1.16 + final String propName = pb.getPropertyName();
1.17 + if (changedProps.contains(propName)) {
1.18 + objs.add(entry.getKey().js);
1.19 + strngs.add(propName);
1.20 + values.add(pb.getValue());
1.21 + }
1.22 }
1.23 }
1.24 notifyMutated.clear();
1.25 }
1.26 Object arrObj = Knockout.toArray(objs.toArray());
1.27 Object arrStr = strngs.toArray();
1.28 - Knockout.valuesMutated(arrObj, arrStr);
1.29 + Object arrVal = Knockout.toArray(values.toArray());
1.30 + Knockout.valuesMutated(arrObj, arrStr, arrVal);
1.31 }
1.32
1.33 @ServiceProvider(service = Contexts.Provider.class)
2.1 --- a/ko-fx/src/main/java/org/apidesign/html/kofx/Knockout.java Fri Sep 13 10:17:21 2013 +0200
2.2 +++ b/ko-fx/src/main/java/org/apidesign/html/kofx/Knockout.java Fri Sep 13 11:04:17 2013 +0200
2.3 @@ -48,19 +48,20 @@
2.4 return KObject.call("array", arr);
2.5 }
2.6
2.7 - @JavaScriptBody(args = { "models", "props" }, body =
2.8 + @JavaScriptBody(args = { "models", "props", "vals" }, body =
2.9 "for (var i = 0; i < models.length; i++) { \n"
2.10 + " var model = models[i];\n"
2.11 + " var prop = props[i];\n"
2.12 + + " var val= vals[i];\n"
2.13 + " if (model) {\n"
2.14 + " var koProp = model[prop];\n"
2.15 + " if (koProp && koProp['valueHasMutated']) {\n"
2.16 - + " koProp['valueHasMutated']();\n"
2.17 + + " koProp['valueHasMutated'](val);\n"
2.18 + " }\n"
2.19 + " }\n"
2.20 + "}\n"
2.21 )
2.22 - native static void valuesMutated(Object arrObjs, Object arrProps);
2.23 + native static void valuesMutated(Object arrObjs, Object arrProps, Object arrVal);
2.24
2.25 @JavaScriptBody(args = { "bindings" }, body = "ko.applyBindings(bindings);")
2.26 native static void applyBindings(Object bindings);
2.27 @@ -82,29 +83,23 @@
2.28 = "var ret = {};\n"
2.29 + "ret['ko-fx.model'] = model;\n"
2.30 + "function koComputed(name, readOnly, value, prop) {\n"
2.31 - + " function realGetter() {\n"
2.32 - + " try {"
2.33 - + " var v = prop.@org.apidesign.html.json.spi.PropertyBinding::getValue()();"
2.34 - + " return v;"
2.35 - + " } catch (e) {"
2.36 - + " alert(\"Cannot call getValue on \" + model + \" prop: \" + name + \" error: \" + e);"
2.37 - + " }"
2.38 - + " }\n"
2.39 - + " var activeGetter = function() { return value; };\n"
2.40 + " var bnd = {"
2.41 - + " read: function() {"
2.42 - + " var r = activeGetter();"
2.43 - + " activeGetter = realGetter;"
2.44 - + " return r;"
2.45 - + " },"
2.46 + + " read: function() { return value; },"
2.47 + " owner: ret\n"
2.48 + " };\n"
2.49 + " if (!readOnly) {\n"
2.50 + " bnd.write = function(val) {\n"
2.51 + + " value = val;\n"
2.52 + " prop.@org.apidesign.html.json.spi.PropertyBinding::setValue(Ljava/lang/Object;)(val);\n"
2.53 - + " };"
2.54 - + " };"
2.55 - + " ret[name] = ko.computed(bnd);"
2.56 + + " };\n"
2.57 + + " };\n"
2.58 + + " var koProp = ko.computed(bnd);\n"
2.59 + + " var koChanged = koProp.valueHasMutated;\n"
2.60 + + " koProp.valueHasMutated = function(newValue) {\n"
2.61 + + " value = newValue;\n"
2.62 + + " koChanged();\n"
2.63 + + " };\n"
2.64 + + " ret[name] = koProp;\n"
2.65 + "}\n"
2.66 + "for (var i = 0; i < propNames.length; i++) {\n"
2.67 + " koComputed(propNames[i], propReadOnly[i], propValues[i], propArr[i]);\n"