# HG changeset patch # User Jaroslav Tulach # Date 1365417372 -7200 # Node ID 445d5f1d41776a34c5024d5522c347822490b21a # Parent 3bd43aa6f08d216218cb886301b59ceb877d4111 Also notify changes in array properties diff -r 3bd43aa6f08d -r 445d5f1d4177 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java Mon Apr 08 12:12:42 2013 +0200 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java Mon Apr 08 12:36:12 2013 +0200 @@ -30,6 +30,7 @@ private final String name; private final String[] deps; private Knockout model; + private Runnable onchange; public KOList(String name, String... deps) { this.name = name; @@ -39,6 +40,14 @@ public void assign(Knockout model) { this.model = model; } + + public KOList onChange(Runnable r) { + if (this.onchange != null) { + throw new IllegalStateException(); + } + this.onchange = r; + return this; + } @Override public boolean add(T e) { @@ -133,12 +142,15 @@ private void notifyChange() { Knockout m = model; - if (m == null) { - return; + if (m != null) { + m.valueHasMutated(name); + for (String dependant : deps) { + m.valueHasMutated(dependant); + } } - m.valueHasMutated(name); - for (String dependant : deps) { - m.valueHasMutated(dependant); + Runnable r = onchange; + if (r != null) { + r.run(); } } diff -r 3bd43aa6f08d -r 445d5f1d4177 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Mon Apr 08 12:12:42 2013 +0200 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Mon Apr 08 12:36:12 2013 +0200 @@ -485,7 +485,7 @@ if (p.array()) { w.write("private KOList<" + tn + "> prop_" + p.name() + " = new KOList<" + tn + ">(\"" + p.name() + "\""); - final Collection dependants = deps.get(p.name()); + Collection dependants = deps.get(p.name()); if (dependants != null) { for (String depProp : dependants) { w.write(", "); @@ -494,7 +494,18 @@ w.write('\"'); } } - w.write(");\n"); + w.write(")"); + + dependants = functionDeps.get(p.name()); + if (dependants != null) { + w.write(".onChange(new Runnable() { public void run() {\n"); + for (String call : dependants) { + w.append(call); + } + w.write("}})"); + } + w.write(";\n"); + w.write("public java.util.List<" + tn + "> " + gs[0] + "() {\n"); w.write(" if (locked) throw new IllegalStateException();\n"); w.write(" prop_" + p.name() + ".assign(ko);\n"); diff -r 3bd43aa6f08d -r 445d5f1d4177 javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java Mon Apr 08 12:12:42 2013 +0200 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java Mon Apr 08 12:36:12 2013 +0200 @@ -191,6 +191,11 @@ static void aPropertyChanged(Modelik m, String name) { m.setChangedProperty(name); } + + @OnPropertyChange({ "values" }) + static void anArrayPropertyChanged(String name, Modelik m) { + m.setChangedProperty(name); + } @Test public void changeAnything() { model.setCount(44); @@ -204,6 +209,11 @@ model.setUnrelated(333); assertEquals(model.getChangedProperty(), "unrelated", "unrelated changed"); } + + @Test public void changeInArray() { + model.getValues().add(10); + assertEquals(model.getChangedProperty(), "values", "Something added into the array"); + } @ComputedProperty static String notAllowedRead() { diff -r 3bd43aa6f08d -r 445d5f1d4177 javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java --- a/javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java Mon Apr 08 12:12:42 2013 +0200 +++ b/javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java Mon Apr 08 12:36:12 2013 +0200 @@ -104,13 +104,16 @@ if (modifiedList != null && modifiedList.getName() != null) { if (modifiedList.getName().equals(activeTweetersName)) { return modifiedList; - } else { - modifiedList.setName(null); } } return findByName(savedLists, activeTweetersName); } + @OnPropertyChange("activeTweetersName") + static void clearModifiedList(TwitterModel m) { + m.setModifiedList(null); + } + @ComputedProperty static boolean hasUnsavedChanges(Tweeters modifiedList) { return modifiedList != null;