You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by jt...@apache.org on 2022/03/16 04:58:28 UTC

[netbeans-html4j] 02/02: Separating the copyFrom and regular binding code

This is an automated email from the ASF dual-hosted git repository.

jtulach pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans-html4j.git

commit e69180c478a2841634bbf148bbcbeb76418a83ba
Author: Jaroslav Tulach <ja...@apidesign.org>
AuthorDate: Wed Mar 16 05:54:04 2022 +0100

    Separating the copyFrom and regular binding code
---
 .../main/java/org/netbeans/html/ko4j/Knockout.java | 75 +++++++++++++++-------
 1 file changed, 51 insertions(+), 24 deletions(-)

diff --git a/ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java b/ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java
index 47bdf7c..12f15e9 100644
--- a/ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java
+++ b/ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java
@@ -247,17 +247,44 @@ final class Knockout  {
           """
           Object.defineProperty(ret, 'ko4j', { value : thiz });
           function normalValue(r) {
-            if (r) try { var br = r.valueOf(); } catch (err) {}
+            if (r) {
+              try {
+                var br = r.valueOf();
+              } catch (err) {
+              }
+            }
             return br === undefined ? r: br;
           }
+          function koCopyFrom(index, name, readOnly, orig) {
+            var bnd = {
+              'read': function() {
+                var r = orig();
+                return normalValue(r);;
+              },
+              'owner': ret
+            };
+            if (!readOnly) {
+              function write(val) {
+                orig(val);
+                var self = ret['ko4j'];
+                if (!self) {
+                    return;
+                }
+                var model = val ? val['ko4j'] : null;
+                self.@org.netbeans.html.ko4j.Knockout::setValue(ILjava/lang/Object;)(index, model ? model : val);
+              }
+              bnd['write'] = write;
+              write(orig());
+              orig.subscribe(write);
+            };
+            var cmpt = ko['computed'](bnd);
+            cmpt['valueHasMutated'] = function(val) {
+              orig(val);
+            };
+            ret[name] = cmpt;
+          }
           function koComputed(index, name, readOnly, value) {
-            var orig = copyFrom ? copyFrom[name] : null;
-            if (!ko['isObservable'](orig)) {
-              orig = null;
-              var trigger = ko['observable']()['extend']({'notify':'always'});
-            } else {
-              var trigger = orig;
-            }
+            var trigger = ko['observable']()['extend']({'notify':'always'});
             function realGetter() {
               var self = ret['ko4j'];
               try {
@@ -267,33 +294,24 @@ final class Knockout  {
                 alert("Cannot call getValue on " + self + " prop: " + name + " error: " + e);
               }
             }
-            var activeGetter = orig ? orig : function() { return value; };
+            var activeGetter = function() { return value; };
             var bnd = {
               'read': function() {
                 trigger();
-                if (orig) {
-                  var r = orig();
-                } else {
-                  var r = activeGetter();
-                  activeGetter = realGetter;
-                }
+                var r = activeGetter();
+                activeGetter = realGetter;
                 return normalValue(r);;
               },
               'owner': ret
             };
             if (!readOnly) {
               function write(val) {
-                if (orig) orig(val);
                 var self = ret['ko4j'];
                 if (!self) return;
                 var model = val ? val['ko4j'] : null;
                 self.@org.netbeans.html.ko4j.Knockout::setValue(ILjava/lang/Object;)(index, model ? model : val);
               };
               bnd['write'] = write;
-              if (orig) {
-                write(orig());
-                orig.subscribe(write);
-              }
             };
             var cmpt = ko['computed'](bnd);
             cmpt['valueHasMutated'] = function(val) {
@@ -303,10 +321,19 @@ final class Knockout  {
             ret[name] = cmpt;
           }
           for (var i = 0; i < propNames.length; i++) {
-            if ((propInfo[i] & 2) !== 0) {
-              ret[propNames[i]] = normalValue(propValues[i]);
+            var pName= propNames[i];
+            var isConstant = (propInfo[i] & 2) !== 0;
+            var isReadOnly = (propInfo[i] & 1) !== 0;
+
+            if (isConstant) {
+              ret[pName] = normalValue(propValues[i]);
             } else {
-              koComputed(i, propNames[i], (propInfo[i] & 1) !== 0, propValues[i]);
+              var orig = copyFrom ? copyFrom[pName] : null;
+              if (ko['isObservable'](orig)) {
+                koCopyFrom(i, pName, isReadOnly, orig);
+              } else {
+                koComputed(i, pName, isReadOnly, propValues[i]);
+              }
             }
           }
           function koExpose(index, name) {
@@ -335,7 +362,7 @@ final class Knockout  {
         for (var p in js) {
           delete js[p];
         };
-        
+
         """
     )
     private static native void clean(Object js);

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists