Also notify changes in array properties model
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 08 Apr 2013 12:36:12 +0200
branchmodel
changeset 950445d5f1d4177
parent 949 3bd43aa6f08d
child 951 d98f6b1caaeb
Also notify changes in array properties
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/KOList.java
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java
javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/ModelTest.java
javaquery/demo-twitter/src/main/java/org/apidesign/bck2brwsr/demo/twitter/TwitterClient.java
     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;