[Commits] r1314 - in core/trunk/geoext: lib/GeoExt/data tests/lib/GeoExt/data

commits at geoext.org commits at geoext.org
Sun Aug 9 03:32:06 CEST 2009


Author: tschaub
Date: 2009-08-09 03:32:05 +0200 (Sun, 09 Aug 2009)
New Revision: 1314

Modified:
   core/trunk/geoext/lib/GeoExt/data/FeatureStore.js
   core/trunk/geoext/tests/lib/GeoExt/data/FeatureStore.html
Log:
Use store.getRecordFromFeature to get the corresponding record for a feature.  Before a feature (or record) has been persisted, the record id does not equal the feature id. r=elemoine (closes #143)

Modified: core/trunk/geoext/lib/GeoExt/data/FeatureStore.js
===================================================================
--- core/trunk/geoext/lib/GeoExt/data/FeatureStore.js	2009-08-07 11:36:36 UTC (rev 1313)
+++ core/trunk/geoext/lib/GeoExt/data/FeatureStore.js	2009-08-09 01:32:05 UTC (rev 1314)
@@ -191,6 +191,27 @@
         }
     },
    
+    /** api: method[getRecordFromFeature]
+     *  :arg feature: ``OpenLayers.Vector.Feature``
+     *  :returns: :class:`GeoExt.data.FeatureRecord` The record corresponding
+     *      to the given feature.  Returns null if no record matches.
+     *
+     *  Get the record corresponding to a feature.
+     */
+    getRecordFromFeature: function(feature) {
+        var record = null;
+        if(feature.state !== OpenLayers.State.INSERT) {
+            record = this.getById(feature.id);
+        } else {
+            var index = this.findBy(function(r) {
+                return r.get("feature") === feature;
+            });
+            if(index > -1) {
+                record = this.getAt(index);
+            }
+        }
+        return record;
+    },
    
     /** private: method[onFeaturesAdded]
      *  Handler for layer featuresadded event
@@ -225,7 +246,7 @@
             var features = evt.features, feature, record, i;
             for(i=features.length - 1; i>=0; i--) {
                 feature = features[i];
-                record = this.getById(feature.id);
+                record = this.getRecordFromFeature(feature);
                 if(record !== undefined) {
                     this._removing = true;
                     this.remove(record);
@@ -234,14 +255,14 @@
             }
         }
     },
-
+    
     /** private: method[onFeatureModified]
      *  Handler for layer featuremodified event
      */
     onFeatureModified: function(evt) {
         if(!this._updating) {
             var feature = evt.feature;
-            var record = this.getById(feature.id);
+            var record = this.getRecordFromFeature(feature);
             if(record !== undefined) {
                 record.beginEdit();
                 attributes = feature.attributes;

Modified: core/trunk/geoext/tests/lib/GeoExt/data/FeatureStore.html
===================================================================
--- core/trunk/geoext/tests/lib/GeoExt/data/FeatureStore.html	2009-08-07 11:36:36 UTC (rev 1313)
+++ core/trunk/geoext/tests/lib/GeoExt/data/FeatureStore.html	2009-08-09 01:32:05 UTC (rev 1314)
@@ -156,6 +156,35 @@
                  'Adding a record with "add" does not add feature to layer if addRecordFilter returns false');
         }
         
+        function test_getRecordFromFeature(t) {
+            t.plan(2);
+
+            var layer = new OpenLayers.Layer.Vector();
+            var store = new GeoExt.data.FeatureStore({
+                layer: layer
+            });
+            var features = [ 
+                new OpenLayers.Feature.Vector(), 
+                new OpenLayers.Feature.Vector() 
+            ];
+            features[0].state = OpenLayers.State.INSERT;
+            layer.addFeatures(features);
+            
+            var record;
+            
+            // confirm that we can get a phantom record
+            record = store.getRecordFromFeature(features[0]);
+            t.ok((record && record.get("feature")) === features[0],
+                 "phantom record retrieved");
+            
+            // confirm that we can get a normal record
+            record = store.getRecordFromFeature(features[1]);
+            t.ok((record && record.get("feature")) === features[1],
+                 "normal record retrieved");
+
+            layer.destroy();
+        }
+        
         function test_addFeatures_removeFeatures(t) {
             
             t.plan(5);
@@ -163,7 +192,11 @@
             var features = [ 
                 new OpenLayers.Feature.Vector(), 
                 new OpenLayers.Feature.Vector() 
-            ]; 
+            ];
+            
+            // set state of one feature to insert to test phantom record removal
+            features[0].state = OpenLayers.State.INSERT;
+            
             var layer = new OpenLayers.Layer.Vector("Foo layer");
             var store = new GeoExt.data.FeatureStore({
                 layer: layer
@@ -198,6 +231,8 @@
                 foo: "foo",
                 bar: "bar"
             });
+            // confirm that we can update phantom records
+            feature.state = OpenLayers.State.INSERT;
 
             id = feature.id;
             
@@ -221,11 +256,12 @@
                 fields: recordType,
                 data: [feature]
             });
+            record = store.getRecordFromFeature(feature);
 
-            t.eq(store.getById(id).get("foo"), "foo",
+            t.eq(record.get("foo"), "foo",
                  "record gets correct initial value for property \"foo\"");
 
-            t.eq(store.getById(id).get("bar"), "bar",
+            t.eq(record.get("bar"), "bar",
                  "record gets correct initial value for property \"bar\"");
 
             /*
@@ -237,21 +273,20 @@
             feature.attributes.bar = "bar2";
             layer.events.triggerEvent("featuremodified", {feature: feature});
 
-            t.eq(store.getById(id).get("foo"), "foo2",
+            t.eq(record.get("foo"), "foo2",
                  "featuremodified event causes update of record property \"foo\"");
 
-            t.eq(store.getById(id).get("bar"), "bar2",
+            t.eq(record.get("bar"), "bar2",
                  "featuremodified event causes update of record property \"bar\"");
 
             // update
-            record = store.getById(id);
             record.set("foo", "foo3");
             record.set("bar", "bar3");
 
-            t.eq(layer.getFeatureById(id).attributes.foo, "foo3",
+            t.eq(feature.attributes.foo, "foo3",
                  "update event causes update of feature property \"foo\"");
 
-            t.eq(layer.getFeatureById(id).attributes.bar, "bar3",
+            t.eq(feature.attributes.bar, "bar3",
                  "update event causes update of feature property \"bar\"");
             
             // make sure calling record.set didn't add any attributes
@@ -266,6 +301,7 @@
             store.getById(feature2.id).set("bar", "bar_f2");
             
             t.eq(feature2.attributes.bar, "bar_f2", "previously undefined attribute set correctly");
+            
 
          }
     </script> 



More information about the Commits mailing list