You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by pi...@apache.org on 2017/01/06 23:55:22 UTC

[5/5] git commit: [flex-asjs] [refs/heads/feature/fontawesome] - Fix bug FLEX-35239 - If in watchers map source of our data binding and event name do not exist make ConstantBinding - If ConstantBinding during initialization won't find in "document" sour

Fix bug  FLEX-35239 - If in watchers map source of our data binding and event name do not exist make ConstantBinding
- If ConstantBinding during initialization won't find in "document" source - trying to create class from sourceID string


Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/b516503b
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/b516503b
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/b516503b

Branch: refs/heads/feature/fontawesome
Commit: b516503befd2b2e4a75a5c0cf9c3bd190c51093c
Parents: fa00540
Author: piotrz <pi...@apache.org>
Authored: Sat Jan 7 00:55:12 2017 +0100
Committer: piotrz <pi...@apache.org>
Committed: Sat Jan 7 00:55:12 2017 +0100

----------------------------------------------------------------------
 .../org/apache/flex/binding/ConstantBinding.as  | 82 ++++++++++++++++----
 .../flex/binding/ItemRendererDataBinding.as     | 49 ++++--------
 2 files changed, 86 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/b516503b/frameworks/projects/Binding/src/main/flex/org/apache/flex/binding/ConstantBinding.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Binding/src/main/flex/org/apache/flex/binding/ConstantBinding.as b/frameworks/projects/Binding/src/main/flex/org/apache/flex/binding/ConstantBinding.as
index 70cb124..ac3d1d6 100644
--- a/frameworks/projects/Binding/src/main/flex/org/apache/flex/binding/ConstantBinding.as
+++ b/frameworks/projects/Binding/src/main/flex/org/apache/flex/binding/ConstantBinding.as
@@ -21,7 +21,11 @@ package org.apache.flex.binding
 	import org.apache.flex.core.IBead;
 	import org.apache.flex.core.IStrand;
 	import org.apache.flex.core.IDocument;
-	
+
+    COMPILE::SWF
+    {
+        import flash.utils.getDefinitionByName;
+    }
     /**
      *  The ConstantBinding class is lightweight data-binding class that
      *  is optimized for simple assignments of one object's constant to
@@ -126,17 +130,53 @@ package org.apache.flex.binding
          */
 		public function set strand(value:IStrand):void
 		{
+            var val:* = null;
+            var objectFromWindow:Object = null;
+
             if (destination == null)
                 destination = value;
             
             if (sourceID != null)
-    			source = document[sourceID];
+            {
+                source = document[sourceID];
+            }
             else
+            {
                 source = document;
-            var val:*;
-            if (sourcePropertyName in source)
+            }
+
+            if (!source)
+            {
+                try
+                {
+                    COMPILE::SWF
+                    {
+                        var classFromSourceId:Class = getDefinitionByName(sourceID) as Class;
+                        if (classFromSourceId)
+                        {
+                            val = classFromSourceId[sourcePropertyName];
+                        }
+                    }
+
+                    COMPILE::JS
+                    {
+                        objectFromWindow = getObjectClassFromWindow(sourceID);
+                        if (objectFromWindow)
+                        {
+                            val = objectFromWindow[sourcePropertyName];
+                        }
+                    }
+                    destination[destinationPropertyName] = val;
+                }
+                catch (e:Error)
+                {
+
+                }
+            }
+            else if (sourcePropertyName in source)
             {
-                try {
+                try
+                {
                     val = source[sourcePropertyName];
                     destination[destinationPropertyName] = val;
                 }
@@ -146,7 +186,8 @@ package org.apache.flex.binding
             }
             else if (sourcePropertyName in source.constructor)
             {
-                try {
+                try
+                {
                     val = source.constructor[sourcePropertyName];
                     destination[destinationPropertyName] = val;
                 }
@@ -164,13 +205,11 @@ package org.apache.flex.binding
                     if (cname) 
                     {
                         cname = cname.names[0].qName;
-                        var parts:Array = cname.split('.');
-                        var n:int = parts.length;
-                        var o:Object = window;
-                        for (var i:int = 0; i < n; i++) {
-                            o = o[parts[i]];
+                        objectFromWindow = getObjectClassFromWindow(cname);
+                        if (objectFromWindow)
+                        {
+                            val = objectFromWindow[sourcePropertyName];
                         }
-                        val = o[sourcePropertyName];
                         destination[destinationPropertyName] = val;
                     }                    
                 }
@@ -190,6 +229,23 @@ package org.apache.flex.binding
 		{
 			this.document = document;
 		}
-		
+
+        COMPILE::JS
+        private function getObjectClassFromWindow(className:Object):Object
+        {
+            var windowObject:Object = window;
+            var parts:Array = className.split('.');
+            var n:int = parts.length;
+            if (n == 0)
+            {
+                return null;
+            }
+
+            for (var i:int = 0; i < n; i++) {
+                windowObject = windowObject[parts[i]];
+            }
+
+            return windowObject;
+        }
 	}
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/b516503b/frameworks/projects/Binding/src/main/flex/org/apache/flex/binding/ItemRendererDataBinding.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Binding/src/main/flex/org/apache/flex/binding/ItemRendererDataBinding.as b/frameworks/projects/Binding/src/main/flex/org/apache/flex/binding/ItemRendererDataBinding.as
index ac54206..315a372 100644
--- a/frameworks/projects/Binding/src/main/flex/org/apache/flex/binding/ItemRendererDataBinding.as
+++ b/frameworks/projects/Binding/src/main/flex/org/apache/flex/binding/ItemRendererDataBinding.as
@@ -72,7 +72,6 @@ package org.apache.flex.binding
             var fieldWatcher:Object;
             var isStatic:Boolean;
             var sb:SimpleBinding;
-            var cb:ConstantBinding;
             if (!("_bindings" in _strand))
                 return;
             var bindingData:Array = _strand["_bindings"];
@@ -92,8 +91,9 @@ package org.apache.flex.binding
             var watchers:Object = decodeWatcher(bindingData.slice(index));
             for (i = 0; i < n; i++)
             {
-                    binding = bindings[i];
+                binding = bindings[i];
                 var destination:IStrand;
+
                 if (binding.source is String)
                 {
                     fieldWatcher = watchers.watcherMap[binding.source];
@@ -130,12 +130,16 @@ package org.apache.flex.binding
                 else if (binding.source is Array
                         && binding.source.length == 2 && binding.destination.length == 2)
                 {
-                    var compWatcher:Object;
-                    compWatcher = watchers.watcherMap[binding.source[0]];
-                    fieldWatcher = compWatcher.children.watcherMap[binding.source[1]];
-                    if (binding.source[0] == "data" ||
-                            (compWatcher.eventNames is String
-                            && compWatcher.eventNames == "dataChange"))
+                    var compWatcher:Object = watchers.watcherMap[binding.source[0]];
+                    if (compWatcher)
+                    {
+                        fieldWatcher = compWatcher.children.watcherMap[binding.source[1]];
+                    }
+
+                    if (compWatcher && fieldWatcher &&
+                            (binding.source[0] == "data" ||
+                            (compWatcher.eventNames is String &&
+                            compWatcher.eventNames == "dataChange")))
                     {
                         var irsb:ItemRendererSimpleBinding = new ItemRendererSimpleBinding();
                         irsb.destinationID = binding.destination[0];
@@ -144,7 +148,7 @@ package org.apache.flex.binding
                         irsb.setDocument(_strand);
                         _strand.addBead(irsb);
                     }
-                    else if (fieldWatcher.eventNames is String)
+                    else if (fieldWatcher != null && fieldWatcher.eventNames is String)
                     {
                         sb = new SimpleBinding();
                         sb.destinationPropertyName = binding.destination[1];
@@ -170,36 +174,17 @@ package org.apache.flex.binding
                             }
                         }
                     }
-                    else if (fieldWatcher.eventNames == null)
+                    else if (fieldWatcher == null || fieldWatcher.eventNames == null)
                     {
-                        cb = new ConstantBinding();
-                        cb.destinationPropertyName = binding.destination[1];
-                        cb.sourceID = binding.source[0];
-                        cb.sourcePropertyName = binding.source[1];
-                        cb.setDocument(_strand);
-                        destObject = _strand[binding.destination[0]];                                
-                        destination = destObject as IStrand;
-                        if (destination)
-                            destination.addBead(cb);
-                        else
-                        {
-                            if (destObject)
-                            {
-                                cb.destination = destObject;
-                                _strand.addBead(cb);
-                            }
-                            else
-                            {
-                                deferredBindings[binding.destination[0]] = cb;
-                                IEventDispatcher(_strand).addEventListener("valueChange", deferredBindingsHandler);
-                            }
-                        }
+                        makeConstantBinding(binding, _strand);
                     }
                 }
                 else
                 {
                     makeGenericBinding(binding, i, watchers);
                 }
+
+                fieldWatcher = null;
             }
         }