Push values of chagned properties rather than letting the browser to callback for them batchnotify
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Fri, 13 Sep 2013 11:04:17 +0200
branchbatchnotify
changeset 297c9b035e84f40
parent 296 fdd06d76c268
child 298 06719f52f85a
Push values of chagned properties rather than letting the browser to callback for them
ko-fx/src/main/java/org/apidesign/html/kofx/FXContext.java
ko-fx/src/main/java/org/apidesign/html/kofx/Knockout.java
     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"