You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2013/06/26 07:46:51 UTC

[1/2] git commit: [flex-asjs] [refs/heads/develop] - Changes to support databinding

Updated Branches:
  refs/heads/develop b48c8d480 -> 286147c15


Changes to support databinding


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

Branch: refs/heads/develop
Commit: 132a29b8ec96589711a846e0a26dd4759b784add
Parents: b48c8d4
Author: Alex Harui <ah...@apache.org>
Authored: Tue Jun 25 07:57:26 2013 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Jun 25 22:46:39 2013 -0700

----------------------------------------------------------------------
 frameworks/as/basic-manifest.xml                |   1 +
 .../org/apache/flex/core/ViewBaseDataBinding.as | 179 +++++++++++++++
 .../org/apache/flex/events/ValueChangeEvent.as  |  10 +
 .../org/apache/flex/core/SimpleStatesImpl.js    |   2 +-
 .../org/apache/flex/core/ViewBaseDataBinding.js | 225 +++++++++++++++++++
 5 files changed, 416 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/132a29b8/frameworks/as/basic-manifest.xml
----------------------------------------------------------------------
diff --git a/frameworks/as/basic-manifest.xml b/frameworks/as/basic-manifest.xml
index 92238a7..e4744aa 100644
--- a/frameworks/as/basic-manifest.xml
+++ b/frameworks/as/basic-manifest.xml
@@ -55,5 +55,6 @@
     <component id="SimpleAlert" class="org.apache.flex.html.staticControls.SimpleAlert"/>
     <component id="Alert" class="org.apache.flex.html.staticControls.Alert"/>
     <component id="Spinner" class="org.apache.flex.html.staticControls.Spinner"/>
+    <component id="ViewBaseDataBinding" class="org.apache.flex.core.ViewBaseDataBinding"/>
 
 </componentPackage>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/132a29b8/frameworks/as/src/org/apache/flex/core/ViewBaseDataBinding.as
----------------------------------------------------------------------
diff --git a/frameworks/as/src/org/apache/flex/core/ViewBaseDataBinding.as b/frameworks/as/src/org/apache/flex/core/ViewBaseDataBinding.as
new file mode 100644
index 0000000..0d5b876
--- /dev/null
+++ b/frameworks/as/src/org/apache/flex/core/ViewBaseDataBinding.as
@@ -0,0 +1,179 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.flex.core
+{
+    import org.apache.flex.binding.ConstantBinding;
+    import org.apache.flex.binding.SimpleBinding;
+    import org.apache.flex.core.IBead;
+    import org.apache.flex.core.IStrand;
+    import org.apache.flex.events.Event;
+    import org.apache.flex.events.IEventDispatcher;
+    
+	public class ViewBaseDataBinding implements IBead
+	{
+		public function ViewBaseDataBinding()
+		{
+			super();
+		}
+        
+        private var _strand:IStrand;
+        public function set strand(value:IStrand):void
+        {
+            _strand = value;
+            IEventDispatcher(_strand).addEventListener("initComplete", initCompleteHandler);
+        }    
+
+        private function initCompleteHandler(event:Event):void
+        {
+            var bindingData:Array = _strand["_bindings"];
+            var n:int = bindingData[0];
+            var bindings:Array = [];
+            var i:int;
+            var index:int = 1;
+            for (i = 0; i < n; i++)
+            {
+                var binding:Object = {};
+                binding.source = bindingData[index++];
+                binding.destination = bindingData[index++];
+                bindings.push(binding);
+            }
+            var watchers:Object = decodeWatcher(bindingData.slice(index));
+            for (i = 0; i < n; i++)
+            {
+                binding = bindings[i];
+                if (binding.source != null)
+                {
+                    if (binding.source is Array)
+                    {
+                        if (binding.source[0] == "applicationModel")
+                        {
+                            if (binding.source.length == 2 && binding.destination.length == 2)
+                            {
+                                var destination:IStrand;
+                                // can be simplebinding or constantbinding
+                                var modelWatcher:Object = watchers.watcherMap["applicationModel"];
+                                var fieldWatcher:Object = modelWatcher.children.watcherMap[binding.source[1]];
+                                if (fieldWatcher.eventNames is String)
+                                {
+                                    var sb:SimpleBinding = new SimpleBinding();
+                                    sb.destinationPropertyName = binding.destination[1];
+                                    sb.eventName = fieldWatcher.eventNames as String;
+                                    sb.sourceID = binding.source[0];
+                                    sb.sourcePropertyName = binding.source[1];
+                                    sb.setDocument(_strand);
+                                    destination = _strand[binding.destination[0]] as IStrand;
+                                    if (destination)
+                                        destination.addBead(sb);
+                                    else
+                                    {
+                                        deferredBindings[binding.destination[0]] = sb;
+                                        IEventDispatcher(_strand).addEventListener("propertyChange", deferredBindingsHandler);
+                                    }
+                                }
+                                else if (fieldWatcher.eventNames == null)
+                                {
+                                    var cb:ConstantBinding = new ConstantBinding();
+                                    cb.destinationPropertyName = binding.destination[1];
+                                    cb.sourceID = binding.source[0];
+                                    cb.sourcePropertyName = binding.source[1];
+                                    cb.setDocument(_strand);
+                                    destination = _strand[binding.destination[0]] as IStrand;
+                                    if (destination)
+                                        destination.addBead(cb);
+                                    else
+                                    {
+                                        deferredBindings[binding.destination[0]] = cb;
+                                        IEventDispatcher(_strand).addEventListener("propertyChange", deferredBindingsHandler);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        
+        private function decodeWatcher(bindingData:Array):Object
+        {
+            var watcherMap:Object = {};
+            var watchers:Array = [];
+            var n:int = bindingData.length;
+            var index:int = 0;
+            var watcherData:Object;
+            while (index < n)
+            {
+                var watcherIndex:int = bindingData[index++];
+                var type:int = bindingData[index++];
+                switch (type)
+                {
+                    case 0:
+                    {
+                        watcherData = { type: "function" };
+                        watcherData.functionName = bindingData[index++];
+                        watcherData.eventNames = bindingData[index++];
+                        watcherData.bindings = bindingData[index++];
+                        break;
+                    }
+                    case 1:
+                    case 2:
+                    {
+                        watcherData = { type: type == 1 ? "static" : "property" };
+                        watcherData.propertyName = bindingData[index++];
+                        watcherData.eventNames = bindingData[index++];
+                        watcherData.bindings = bindingData[index++];
+                        watcherData.getterFunction = bindingData[index++];
+                        watcherMap[watcherData.propertyName] = watcherData;
+                        break;
+                    }
+                    case 3:
+                    {
+                        watcherData = { type: "xml" };
+                        watcherData.propertyName = bindingData[index++];
+                        watcherData.bindings = bindingData[index++];
+                        watcherMap[watcherData.propertyName] = watcherData;
+                        break;
+                    }
+                }
+                watcherData.children = bindingData[index++];
+                if (watcherData.children != null)
+                {
+                    watcherData.children = decodeWatcher(watcherData.children);
+                }
+                watcherData.index = watcherIndex;
+                watchers.push(watcherData);
+            }            
+            return { watchers: watchers, watcherMap: watcherMap };
+        }
+        
+        private var deferredBindings:Object = {};
+        private function deferredBindingsHandler(event:Event):void
+        {
+            for (var p:String in deferredBindings)
+            {
+                if (_strand[p] != null)
+                {
+                    var destination:IStrand = _strand[p] as IStrand;
+                    destination.addBead(deferredBindings[p]);
+                    delete deferredBindings[p];
+                }
+            }
+        }
+        
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/132a29b8/frameworks/as/src/org/apache/flex/events/ValueChangeEvent.as
----------------------------------------------------------------------
diff --git a/frameworks/as/src/org/apache/flex/events/ValueChangeEvent.as b/frameworks/as/src/org/apache/flex/events/ValueChangeEvent.as
index 88e7463..4a759f7 100644
--- a/frameworks/as/src/org/apache/flex/events/ValueChangeEvent.as
+++ b/frameworks/as/src/org/apache/flex/events/ValueChangeEvent.as
@@ -30,7 +30,17 @@ package org.apache.flex.events
 		
 		public var oldValue:Object;
 		public var newValue:Object;
+        public var propertyName:String;
+        public var source:Object;
 		
 		public static const VALUE_CHANGE:String = "valueChange";
+        
+        public static function createUpdateEvent(source:Object, name:String, oldValue:Object, newValue:Object):ValueChangeEvent
+        {
+            var event:ValueChangeEvent = new ValueChangeEvent(VALUE_CHANGE, false, false, oldValue, newValue);
+            event.propertyName = name;
+            event.source = source;
+            return event;
+        }
 	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/132a29b8/frameworks/js/FlexJS/src/org/apache/flex/core/SimpleStatesImpl.js
----------------------------------------------------------------------
diff --git a/frameworks/js/FlexJS/src/org/apache/flex/core/SimpleStatesImpl.js b/frameworks/js/FlexJS/src/org/apache/flex/core/SimpleStatesImpl.js
index 4392257..5817de4 100644
--- a/frameworks/js/FlexJS/src/org/apache/flex/core/SimpleStatesImpl.js
+++ b/frameworks/js/FlexJS/src/org/apache/flex/core/SimpleStatesImpl.js
@@ -34,7 +34,7 @@ goog.inherits(org.apache.flex.core.SimpleStatesImpl,
 
 /**
  * @expose
- * @this {org.apache.flex.net.dataConverters.LazyCollection}
+ * @this {org.apache.flex.core.SimpleStatesImpl}
  * @param {Object} value The new host.
  */
 org.apache.flex.core.SimpleStatesImpl.prototype.set_strand =

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/132a29b8/frameworks/js/FlexJS/src/org/apache/flex/core/ViewBaseDataBinding.js
----------------------------------------------------------------------
diff --git a/frameworks/js/FlexJS/src/org/apache/flex/core/ViewBaseDataBinding.js b/frameworks/js/FlexJS/src/org/apache/flex/core/ViewBaseDataBinding.js
new file mode 100644
index 0000000..5f7b5d0
--- /dev/null
+++ b/frameworks/js/FlexJS/src/org/apache/flex/core/ViewBaseDataBinding.js
@@ -0,0 +1,225 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+goog.provide('org.apache.flex.core.ViewBaseDataBinding');
+
+goog.require('org.apache.flex.binding.ConstantBinding');
+goog.require('org.apache.flex.binding.SimpleBinding');
+goog.require('org.apache.flex.events.Event');
+
+    
+/**
+ * @constructor
+ */
+org.apache.flex.core.ViewBaseDataBinding = function() {
+
+  /**
+   * @private
+   * @type {Object}
+   */
+  this.strand_ = null;
+
+  /**
+   * @private
+   * @type {Object}
+   */
+  this.deferredBindings = {};
+
+};
+        
+/**
+ * @expose
+ * @this {org.apache.flex.core.ViewBaseDataBinding}
+ * @param {Object} value The new host.
+ */
+org.apache.flex.core.ViewBaseDataBinding.prototype.set_strand =
+    function(value) {
+  if (this.strand_ !== value) {
+    this.strand_ = value;
+    this.strand_.addEventListener('initComplete',
+        goog.bind(this.initCompleteHandler, this));
+  }
+};
+
+
+/**
+ * @protected
+ * @this {org.apache.flex.core.ViewBaseDataBinding}
+ * @param {Object} event The event.
+ */
+org.apache.flex.core.ViewBaseDataBinding.prototype.initCompleteHandler =
+    function(event) {
+
+    var bindingData = this.strand_["_bindings"];
+    var n = bindingData[0];
+    var bindings = [];
+    var i;
+    var index = 1;
+    for (i = 0; i < n; i++)
+    {
+        var binding = {};
+        binding.source = bindingData[index++];
+        binding.destination = bindingData[index++];
+        bindings.push(binding);
+    }
+    var watchers = this.decodeWatcher(bindingData.slice(index));
+    for (i = 0; i < n; i++)
+    {
+        binding = bindings[i];
+        if (binding.source != null)
+        {
+            // try to determine if it is an array
+            if (typeof(binding.source) == "object" &&
+                typeof(binding.source.slice) == "function")
+            {
+                if (binding.source[0] == "applicationModel")
+                {
+                    if (binding.source.length == 2 &&
+                        binding.destination.length == 2)
+                    {
+                        var destination;
+                        // can be simplebinding or constantbinding
+                        var modelWatcher = 
+                            watchers.watcherMap["applicationModel"];
+                        var childMap = modelWatcher.children.watcherMap
+                        var fieldWatcher = childMap[binding.source[1]];
+                        if (typeof(fieldWatcher.eventNames) == "string")
+                        {
+                          var sb;
+                          sb = new org.apache.flex.binding.SimpleBinding();
+                          sb.destinationPropertyName = 
+                                    binding.destination[1];
+                          sb.eventName = fieldWatcher.eventNames;
+                          sb.sourceID = binding.source[0];
+                          sb.sourcePropertyName = binding.source[1];
+                          sb.setDocument(this.strand_);
+                          destination = this.strand_[
+                                            binding.destination[0]];
+                          if (destination)
+                              destination.addBead(sb);
+                          else
+                          {
+                            this.deferredBindings[binding.destination[0]] =
+                                    sb;
+                            this.strand_.addEventListener("propertyChange",
+                                    this.deferredBindingsHandler);
+                          }
+                        }
+                        else if (fieldWatcher.eventNames == null)
+                        {
+                          var cb;
+                          cb = org.apache.flex.binding.ConstantBinding;
+                          cb = new cb();
+                          cb.destinationPropertyName = 
+                                binding.destination[1];
+                          cb.sourceID = binding.source[0];
+                          cb.sourcePropertyName = binding.source[1];
+                          cb.setDocument(this.strand_);
+                          destination = this.strand_[
+                                            binding.destination[0]];
+                          if (destination)
+                                destination.addBead(cb);
+                          else
+                          {
+                            this.deferredBindings[binding.destination[0]] =
+                                cb;
+                            this.strand_.addEventListener("propertyChange",
+                                this.deferredBindingsHandler);
+                          }
+                        }
+                    }
+                }
+            }
+        }
+    }
+};
+        
+/**
+ * @protected
+ * @this {org.apache.flex.core.ViewBaseDataBinding}
+ * @param {Object} bindingData The watcher data to decode.
+ * @return {Object} The watcher tree structure.
+ */
+org.apache.flex.core.ViewBaseDataBinding.prototype.decodeWatcher =
+    function(bindingData) {
+    var watcherMap = {};
+    var watchers = [];
+    var n = bindingData.length - 1; // there is an extra null because
+                                    // it is easier for the compiler
+    var index = 0;
+    var watcherData;
+    while (index < n)
+    {
+        var watcherIndex = bindingData[index++];
+        var type = bindingData[index++];
+        switch (type)
+        {
+            case 0:
+            {
+                watcherData = { type: "function" };
+                watcherData.functionName = bindingData[index++];
+                watcherData.eventNames = bindingData[index++];
+                watcherData.bindings = bindingData[index++];
+                break;
+            }
+            case 1:
+            case 2:
+            {
+                watcherData = { type: type == 1 ? "static" : "property" };
+                watcherData.propertyName = bindingData[index++];
+                watcherData.eventNames = bindingData[index++];
+                watcherData.bindings = bindingData[index++];
+                watcherData.getterFunction = bindingData[index++];
+                watcherMap[watcherData.propertyName] = watcherData;
+                break;
+            }
+            case 3:
+            {
+                watcherData = { type: "xml" };
+                watcherData.propertyName = bindingData[index++];
+                watcherData.bindings = bindingData[index++];
+                watcherMap[watcherData.propertyName] = watcherData;
+                break;
+            }
+        }
+        watcherData.children = bindingData[index++];
+        if (watcherData.children != null)
+        {
+            watcherData.children = this.decodeWatcher(watcherData.children);
+        }
+        watcherData.index = watcherIndex;
+        watchers.push(watcherData);
+    }            
+    return { watchers: watchers, watcherMap: watcherMap };
+};
+        
+/**
+ * @protected
+ * @this {org.apache.flex.core.ViewBaseDataBinding}
+ * @param {Object} event The event.
+ */
+org.apache.flex.core.ViewBaseDataBinding.prototype.deferredBindingsHandler =
+function(event) {
+    var p;
+    for (p in this.deferredBindings)
+    {
+        if (this.strand_[p] != null)
+        {
+            var destination = this.strand_[p];
+            destination.addBead(this.deferredBindings[p]);
+            delete deferredBindings[p];
+        }
+    }
+};
+


[2/2] git commit: [flex-asjs] [refs/heads/develop] - more fixes for databinding

Posted by ah...@apache.org.
more fixes for databinding


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

Branch: refs/heads/develop
Commit: 286147c15f3c309de9108000fcd473c6db907d47
Parents: 132a29b
Author: Alex Harui <ah...@apache.org>
Authored: Tue Jun 25 22:41:41 2013 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Jun 25 22:46:40 2013 -0700

----------------------------------------------------------------------
 .../org/apache/flex/core/ViewBaseDataBinding.as |  4 +--
 .../org/apache/flex/core/ViewBaseDataBinding.js | 38 ++++++++++++++------
 2 files changed, 29 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/286147c1/frameworks/as/src/org/apache/flex/core/ViewBaseDataBinding.as
----------------------------------------------------------------------
diff --git a/frameworks/as/src/org/apache/flex/core/ViewBaseDataBinding.as b/frameworks/as/src/org/apache/flex/core/ViewBaseDataBinding.as
index 0d5b876..2761295 100644
--- a/frameworks/as/src/org/apache/flex/core/ViewBaseDataBinding.as
+++ b/frameworks/as/src/org/apache/flex/core/ViewBaseDataBinding.as
@@ -83,7 +83,7 @@ package org.apache.flex.core
                                     else
                                     {
                                         deferredBindings[binding.destination[0]] = sb;
-                                        IEventDispatcher(_strand).addEventListener("propertyChange", deferredBindingsHandler);
+                                        IEventDispatcher(_strand).addEventListener("valueChange", deferredBindingsHandler);
                                     }
                                 }
                                 else if (fieldWatcher.eventNames == null)
@@ -99,7 +99,7 @@ package org.apache.flex.core
                                     else
                                     {
                                         deferredBindings[binding.destination[0]] = cb;
-                                        IEventDispatcher(_strand).addEventListener("propertyChange", deferredBindingsHandler);
+                                        IEventDispatcher(_strand).addEventListener("valueChange", deferredBindingsHandler);
                                     }
                                 }
                             }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/286147c1/frameworks/js/FlexJS/src/org/apache/flex/core/ViewBaseDataBinding.js
----------------------------------------------------------------------
diff --git a/frameworks/js/FlexJS/src/org/apache/flex/core/ViewBaseDataBinding.js b/frameworks/js/FlexJS/src/org/apache/flex/core/ViewBaseDataBinding.js
index 5f7b5d0..7a94187 100644
--- a/frameworks/js/FlexJS/src/org/apache/flex/core/ViewBaseDataBinding.js
+++ b/frameworks/js/FlexJS/src/org/apache/flex/core/ViewBaseDataBinding.js
@@ -61,7 +61,7 @@ org.apache.flex.core.ViewBaseDataBinding.prototype.set_strand =
 org.apache.flex.core.ViewBaseDataBinding.prototype.initCompleteHandler =
     function(event) {
 
-    var bindingData = this.strand_["_bindings"];
+    var bindingData = this.strand_['_bindings'];
     var n = bindingData[0];
     var bindings = [];
     var i;
@@ -80,10 +80,10 @@ org.apache.flex.core.ViewBaseDataBinding.prototype.initCompleteHandler =
         if (binding.source != null)
         {
             // try to determine if it is an array
-            if (typeof(binding.source) == "object" &&
-                typeof(binding.source.slice) == "function")
+            if (typeof(binding.source) == 'object' &&
+                typeof(binding.source.slice) == 'function')
             {
-                if (binding.source[0] == "applicationModel")
+                if (binding.source[0] == 'applicationModel')
                 {
                     if (binding.source.length == 2 &&
                         binding.destination.length == 2)
@@ -91,10 +91,10 @@ org.apache.flex.core.ViewBaseDataBinding.prototype.initCompleteHandler =
                         var destination;
                         // can be simplebinding or constantbinding
                         var modelWatcher = 
-                            watchers.watcherMap["applicationModel"];
+                            watchers.watcherMap['applicationModel'];
                         var childMap = modelWatcher.children.watcherMap
                         var fieldWatcher = childMap[binding.source[1]];
-                        if (typeof(fieldWatcher.eventNames) == "string")
+                        if (typeof(fieldWatcher.eventNames) == 'string')
                         {
                           var sb;
                           sb = new org.apache.flex.binding.SimpleBinding();
@@ -106,13 +106,18 @@ org.apache.flex.core.ViewBaseDataBinding.prototype.initCompleteHandler =
                           sb.setDocument(this.strand_);
                           destination = this.strand_[
                                             binding.destination[0]];
+                          if (destination == null && 
+                                typeof(this.strand_['get_' +
+                                    binding.destination[0]] == 'function'))
+                                destination = this.strand_[
+                                        'get_' + binding.destination[0]]();
                           if (destination)
                               destination.addBead(sb);
                           else
                           {
                             this.deferredBindings[binding.destination[0]] =
                                     sb;
-                            this.strand_.addEventListener("propertyChange",
+                            this.strand_.addEventListener('valueChange',
                                     this.deferredBindingsHandler);
                           }
                         }
@@ -128,13 +133,18 @@ org.apache.flex.core.ViewBaseDataBinding.prototype.initCompleteHandler =
                           cb.setDocument(this.strand_);
                           destination = this.strand_[
                                             binding.destination[0]];
+                          if (destination == null && 
+                                typeof(this.strand_['get_' +
+                                    binding.destination[0]] == 'function'))
+                                destination = this.strand_[
+                                        'get_' + binding.destination[0]]();
                           if (destination)
                                 destination.addBead(cb);
                           else
                           {
                             this.deferredBindings[binding.destination[0]] =
                                 cb;
-                            this.strand_.addEventListener("propertyChange",
+                            this.strand_.addEventListener('valueChange',
                                 this.deferredBindingsHandler);
                           }
                         }
@@ -167,7 +177,7 @@ org.apache.flex.core.ViewBaseDataBinding.prototype.decodeWatcher =
         {
             case 0:
             {
-                watcherData = { type: "function" };
+                watcherData = { type: 'function' };
                 watcherData.functionName = bindingData[index++];
                 watcherData.eventNames = bindingData[index++];
                 watcherData.bindings = bindingData[index++];
@@ -176,7 +186,7 @@ org.apache.flex.core.ViewBaseDataBinding.prototype.decodeWatcher =
             case 1:
             case 2:
             {
-                watcherData = { type: type == 1 ? "static" : "property" };
+                watcherData = { type: type == 1 ? 'static' : 'property' };
                 watcherData.propertyName = bindingData[index++];
                 watcherData.eventNames = bindingData[index++];
                 watcherData.bindings = bindingData[index++];
@@ -186,7 +196,7 @@ org.apache.flex.core.ViewBaseDataBinding.prototype.decodeWatcher =
             }
             case 3:
             {
-                watcherData = { type: "xml" };
+                watcherData = { type: 'xml' };
                 watcherData.propertyName = bindingData[index++];
                 watcherData.bindings = bindingData[index++];
                 watcherMap[watcherData.propertyName] = watcherData;
@@ -220,6 +230,12 @@ function(event) {
             destination.addBead(this.deferredBindings[p]);
             delete deferredBindings[p];
         }
+        else if (typeof(this.strand_['get_' + p]) == 'function')
+        {
+            var destination = this.strand_['get_' + p]();
+            destination.addBead(this.deferredBindings[p]);
+            delete deferredBindings[p];
+        }
     }
 };