1.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java Mon Apr 08 12:12:42 2013 +0200
1.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java Mon Apr 08 12:36:12 2013 +0200
1.3 @@ -30,6 +30,7 @@
1.4 private final String name;
1.5 private final String[] deps;
1.6 private Knockout model;
1.7 + private Runnable onchange;
1.8
1.9 public KOList(String name, String... deps) {
1.10 this.name = name;
1.11 @@ -39,6 +40,14 @@
1.12 public void assign(Knockout model) {
1.13 this.model = model;
1.14 }
1.15 +
1.16 + public KOList<T> onChange(Runnable r) {
1.17 + if (this.onchange != null) {
1.18 + throw new IllegalStateException();
1.19 + }
1.20 + this.onchange = r;
1.21 + return this;
1.22 + }
1.23
1.24 @Override
1.25 public boolean add(T e) {
1.26 @@ -133,12 +142,15 @@
1.27
1.28 private void notifyChange() {
1.29 Knockout m = model;
1.30 - if (m == null) {
1.31 - return;
1.32 + if (m != null) {
1.33 + m.valueHasMutated(name);
1.34 + for (String dependant : deps) {
1.35 + m.valueHasMutated(dependant);
1.36 + }
1.37 }
1.38 - m.valueHasMutated(name);
1.39 - for (String dependant : deps) {
1.40 - m.valueHasMutated(dependant);
1.41 + Runnable r = onchange;
1.42 + if (r != null) {
1.43 + r.run();
1.44 }
1.45 }
1.46
2.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Mon Apr 08 12:12:42 2013 +0200
2.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Mon Apr 08 12:36:12 2013 +0200
2.3 @@ -485,7 +485,7 @@
2.4 if (p.array()) {
2.5 w.write("private KOList<" + tn + "> prop_" + p.name() + " = new KOList<" + tn + ">(\""
2.6 + p.name() + "\"");
2.7 - final Collection<String> dependants = deps.get(p.name());
2.8 + Collection<String> dependants = deps.get(p.name());
2.9 if (dependants != null) {
2.10 for (String depProp : dependants) {
2.11 w.write(", ");
2.12 @@ -494,7 +494,18 @@
2.13 w.write('\"');
2.14 }
2.15 }
2.16 - w.write(");\n");
2.17 + w.write(")");
2.18 +
2.19 + dependants = functionDeps.get(p.name());
2.20 + if (dependants != null) {
2.21 + w.write(".onChange(new Runnable() { public void run() {\n");
2.22 + for (String call : dependants) {
2.23 + w.append(call);
2.24 + }
2.25 + w.write("}})");
2.26 + }
2.27 + w.write(";\n");
2.28 +
2.29 w.write("public java.util.List<" + tn + "> " + gs[0] + "() {\n");
2.30 w.write(" if (locked) throw new IllegalStateException();\n");
2.31 w.write(" prop_" + p.name() + ".assign(ko);\n");
3.1 --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java Mon Apr 08 12:12:42 2013 +0200
3.2 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java Mon Apr 08 12:36:12 2013 +0200
3.3 @@ -191,6 +191,11 @@
3.4 static void aPropertyChanged(Modelik m, String name) {
3.5 m.setChangedProperty(name);
3.6 }
3.7 +
3.8 + @OnPropertyChange({ "values" })
3.9 + static void anArrayPropertyChanged(String name, Modelik m) {
3.10 + m.setChangedProperty(name);
3.11 + }
3.12
3.13 @Test public void changeAnything() {
3.14 model.setCount(44);
3.15 @@ -204,6 +209,11 @@
3.16 model.setUnrelated(333);
3.17 assertEquals(model.getChangedProperty(), "unrelated", "unrelated changed");
3.18 }
3.19 +
3.20 + @Test public void changeInArray() {
3.21 + model.getValues().add(10);
3.22 + assertEquals(model.getChangedProperty(), "values", "Something added into the array");
3.23 + }
3.24
3.25 @ComputedProperty
3.26 static String notAllowedRead() {
4.1 --- a/javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java Mon Apr 08 12:12:42 2013 +0200
4.2 +++ b/javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java Mon Apr 08 12:36:12 2013 +0200
4.3 @@ -104,13 +104,16 @@
4.4 if (modifiedList != null && modifiedList.getName() != null) {
4.5 if (modifiedList.getName().equals(activeTweetersName)) {
4.6 return modifiedList;
4.7 - } else {
4.8 - modifiedList.setName(null);
4.9 }
4.10 }
4.11 return findByName(savedLists, activeTweetersName);
4.12 }
4.13
4.14 + @OnPropertyChange("activeTweetersName")
4.15 + static void clearModifiedList(TwitterModel m) {
4.16 + m.setModifiedList(null);
4.17 + }
4.18 +
4.19 @ComputedProperty
4.20 static boolean hasUnsavedChanges(Tweeters modifiedList) {
4.21 return modifiedList != null;