Hi Peter, I was going through the DataTable class code and I see that you are adding mapper bead in addedToParent.
override public function addedToParent():void { super.addedToParent(); addBead(new DataTableMapperForArrayListData()); dispatchEvent( new Event("initComplete") ); } If I add event listener to DataTable class I will get "initComplete" two times. You will not have issue with added bead, but developer who will get this class and use it could have. Piotr 2017-05-02 22:34 GMT+02:00 <p...@apache.org>: > Repository: flex-asjs > Updated Branches: > refs/heads/develop 82ff1840e -> 336fac64c > > > Added example of building a Table from a data source to the TableExample > example. > > > Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo > Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/336fac64 > Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/336fac64 > Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/336fac64 > > Branch: refs/heads/develop > Commit: 336fac64c0eed8b063213a72899f658e9d490cea > Parents: 82ff184 > Author: Peter Ent <p...@apache.org> > Authored: Tue May 2 16:33:57 2017 -0400 > Committer: Peter Ent <p...@apache.org> > Committed: Tue May 2 16:33:57 2017 -0400 > > ---------------------------------------------------------------------- > .../src/main/flex/MyInitialView.mxml | 31 ++++- > .../src/main/flex/TableExample.mxml | 3 + > .../src/main/flex/dataTable/DataColumn.as | 33 ++++++ > .../src/main/flex/dataTable/DataTable.as | 69 ++++++++++++ > .../mapper/DataTableMapperForArrayListData.as | 112 +++++++++++++++++++ > .../main/flex/dataTable/model/DataTableModel.as | 40 +++++++ > .../src/main/flex/models/ProductsModel.as | 47 ++++++++ > 7 files changed, 334 insertions(+), 1 deletion(-) > ---------------------------------------------------------------------- > > > http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/ > 336fac64/examples/flexjs/TableExample/src/main/flex/MyInitialView.mxml > ---------------------------------------------------------------------- > diff --git a/examples/flexjs/TableExample/src/main/flex/MyInitialView.mxml > b/examples/flexjs/TableExample/src/main/flex/MyInitialView.mxml > index c2f81dd..11d2e29 100644 > --- a/examples/flexjs/TableExample/src/main/flex/MyInitialView.mxml > +++ b/examples/flexjs/TableExample/src/main/flex/MyInitialView.mxml > @@ -18,7 +18,9 @@ limitations under the License. > > --> > <js:View xmlns:fx="http://ns.adobe.com/mxml/2009" > - xmlns:js="library://ns.apache. > org/flexjs/basic"> > + xmlns:js="library://ns.apache. > org/flexjs/basic" > + xmlns:dataTable="dataTable.*" > + xmlns:model="dataTable.model.*"> > > <fx:Style> > @namespace js "library://ns.apache.org/flexjs/basic"; > @@ -44,6 +46,10 @@ limitations under the License. > padding: 6px; > } > > + .DataTable { > + iBeadModel: ClassReference("dataTable. > model.DataTableModel"); > + } > + > </fx:Style> > > <js:beads> > @@ -117,5 +123,28 @@ limitations under the License. > </js:TableCell> > </js:TableRow> > </js:Table> > + > + <!-- Generates a Table structure from a data source --> > + > + <dataTable:DataTable x="600" y="0" width="400" height="400"> > + <dataTable:beads> > + <js:ConstantBinding > + sourceID="applicationModel" > + sourcePropertyName="products" > + destinationPropertyName="dataProvider" /> > + </dataTable:beads> > + <dataTable:DataColumn > + dataField="name" > + label="State" > + > itemRenderer="org.apache.flex.html.supportClasses.StringItemRenderer" > /> > + <dataTable:DataColumn > + dataField="capital" > + label="Capital" > + > itemRenderer="org.apache.flex.html.supportClasses.StringItemRenderer" > /> > + <dataTable:DataColumn > + dataField="country" > + label="Country" > + > itemRenderer="org.apache.flex.html.supportClasses.StringItemRenderer" > /> > + </dataTable:DataTable> > > </js:View> > > http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/ > 336fac64/examples/flexjs/TableExample/src/main/flex/TableExample.mxml > ---------------------------------------------------------------------- > diff --git a/examples/flexjs/TableExample/src/main/flex/TableExample.mxml > b/examples/flexjs/TableExample/src/main/flex/TableExample.mxml > index 2d5c972..41989f8 100644 > --- a/examples/flexjs/TableExample/src/main/flex/TableExample.mxml > +++ b/examples/flexjs/TableExample/src/main/flex/TableExample.mxml > @@ -27,6 +27,9 @@ > <js:valuesImpl> > <js:SimpleCSSValuesImpl /> > </js:valuesImpl> > + <js:model> > + <models:ProductsModel /> > + </js:model> > <js:initialView> > <local:MyInitialView /> > </js:initialView> > > http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/ > 336fac64/examples/flexjs/TableExample/src/main/flex/ > dataTable/DataColumn.as > ---------------------------------------------------------------------- > diff --git > a/examples/flexjs/TableExample/src/main/flex/dataTable/DataColumn.as > b/examples/flexjs/TableExample/src/main/flex/dataTable/DataColumn.as > new file mode 100644 > index 0000000..b8e5f2e > --- /dev/null > +++ b/examples/flexjs/TableExample/src/main/flex/dataTable/DataColumn.as > @@ -0,0 +1,33 @@ > +/////////////////////////////////////////////////////////// > ///////////////////// > +// > +// 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 dataTable > +{ > + import org.apache.flex.html.supportClasses.DataGridColumn; > + > + /** > + * DataColumn is exactly like DataGridColumn > + */ > + public class DataColumn extends DataGridColumn > + { > + public function DataColumn() > + { > + super(); > + } > + } > +} > \ No newline at end of file > > http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/ > 336fac64/examples/flexjs/TableExample/src/main/flex/dataTable/DataTable.as > ---------------------------------------------------------------------- > diff --git a/examples/flexjs/TableExample/src/main/flex/dataTable/DataTable.as > b/examples/flexjs/TableExample/src/main/flex/dataTable/DataTable.as > new file mode 100644 > index 0000000..1b388b6 > --- /dev/null > +++ b/examples/flexjs/TableExample/src/main/flex/dataTable/DataTable.as > @@ -0,0 +1,69 @@ > +/////////////////////////////////////////////////////////// > ///////////////////// > +// > +// 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 dataTable > +{ > + import dataTable.mapper.DataTableMapperForArrayListData; > + import dataTable.model.DataTableModel; > + > + import org.apache.flex.events.Event; > + import org.apache.flex.html.Table; > + > + [DefaultProperty("columns")] > + > + /** > + * The DataTable uses Table along with a data mapper and item > renderers to generate > + * a Table from a data source. > + */ > + public class DataTable extends Table > + { > + public function DataTable() > + { > + super(); > + > + className = "DataTable"; > + } > + > + public function get columns():Array > + { > + return DataTableModel(model).columns; > + } > + public function set columns(value:Array):void > + { > + DataTableModel(model).columns = value; > + } > + > + public function get dataProvider():Object > + { > + return DataTableModel(model).dataProvider; > + } > + public function set dataProvider(value:Object):void > + { > + DataTableModel(model).dataProvider = value; > + } > + > + override public function addedToParent():void > + { > + super.addedToParent(); > + > + addBead(new DataTableMapperForArrayListData()); > + > + dispatchEvent( new Event("initComplete") ); > + } > + } > +} > \ No newline at end of file > > http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/ > 336fac64/examples/flexjs/TableExample/src/main/flex/dataTable/mapper/ > DataTableMapperForArrayListData.as > ---------------------------------------------------------------------- > diff --git a/examples/flexjs/TableExample/src/main/flex/dataTable/mapper/ > DataTableMapperForArrayListData.as b/examples/flexjs/ > TableExample/src/main/flex/dataTable/mapper/DataTableMapperForArrayListDat > a.as > new file mode 100644 > index 0000000..c80234c > --- /dev/null > +++ b/examples/flexjs/TableExample/src/main/flex/dataTable/mapper/ > DataTableMapperForArrayListData.as > @@ -0,0 +1,112 @@ > +/////////////////////////////////////////////////////////// > ///////////////////// > +// > +// 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 dataTable.mapper > +{ > + import dataTable.DataColumn; > + import dataTable.model.DataTableModel; > + > + import org.apache.flex.collections.ArrayList; > + import org.apache.flex.core.IBead; > + import org.apache.flex.core.IBeadModel; > + import org.apache.flex.core.IStrand; > + import org.apache.flex.events.Event; > + import org.apache.flex.events.IEventDispatcher; > + import org.apache.flex.html.Label; > + import org.apache.flex.html.Table; > + import org.apache.flex.html.TableCell; > + import org.apache.flex.html.TableHeader; > + import org.apache.flex.html.TableRow; > + import org.apache.flex.html.supportClasses.DataItemRenderer; > + > + public class DataTableMapperForArrayListData implements IBead > + { > + public function DataTableMapperForArrayListData() > + { > + } > + > + private var _strand:IStrand; > + > + public function set strand(value:IStrand):void > + { > + _strand = value; > + > + > IEventDispatcher(_strand).addEventListener("initComplete", > handleInitComplete); > + } > + > + private function handleInitComplete(event:Event):void > + { > + var model:DataTableModel = > _strand.getBeadByType(IBeadModel) > as DataTableModel; > + if (model == null) return; > + > + var dp:ArrayList = model.dataProvider as ArrayList; > + if (dp == null || dp.length == 0) return; > + > + var table:Table = _strand as Table; > + > + var createHeaderRow:Boolean = false; > + for(var c:int=0; c < model.columns.length; c++) > + { > + var test:DataColumn = model.columns[c] as > DataColumn; > + if (test.label != null) { > + createHeaderRow = true; > + break; > + } > + } > + > + if (createHeaderRow) { > + var headerRow:TableRow = new TableRow(); > + > + for(c=0; c < model.columns.length; c++) > + { > + test = model.columns[c] as > DataColumn; > + var tableHeader:TableHeader = new > TableHeader(); > + var label:Label = new Label(); > + tableHeader.addElement(label); > + label.text = test.label == null ? > "" : test.label; > + headerRow.addElement(tableHeader); > + } > + > + table.addElement(headerRow); > + } > + > + for(var i:int=0; i < dp.length; i++) > + { > + var tableRow:TableRow = new TableRow(); > + > + for(var j:int=0; j < model.columns.length; > j++) > + { > + var column:DataColumn = > model.columns[j] as DataColumn; > + var tableCell:TableCell = new > TableCell(); > + > + var ir:DataItemRenderer = > column.itemRenderer.newInstance() as DataItemRenderer; > + tableCell.addElement(ir); > + tableRow.addElement(tableCell); > + > + ir.labelField = column.dataField; > + ir.index = i; > + ir.data = dp.getItemAt(i); > + } > + > + table.addElement(tableRow); > + } > + > + table.dispatchEvent(new Event("layoutNeeded")); > + } > + } > +} > \ No newline at end of file > > http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/ > 336fac64/examples/flexjs/TableExample/src/main/flex/dataTable/model/ > DataTableModel.as > ---------------------------------------------------------------------- > diff --git > a/examples/flexjs/TableExample/src/main/flex/dataTable/model/DataTableModel.as > b/examples/flexjs/TableExample/src/main/flex/dataTable/model/ > DataTableModel.as > new file mode 100644 > index 0000000..084b512 > --- /dev/null > +++ b/examples/flexjs/TableExample/src/main/flex/dataTable/model/ > DataTableModel.as > @@ -0,0 +1,40 @@ > +/////////////////////////////////////////////////////////// > ///////////////////// > +// > +// 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 dataTable.model > +{ > + import org.apache.flex.html.beads.models.ArrayListSelectionModel; > + > + public class DataTableModel extends ArrayListSelectionModel > + { > + public function DataTableModel() > + { > + super(); > + } > + > + private var _columns:Array; > + public function get columns():Array > + { > + return _columns; > + } > + public function set columns(value:Array):void > + { > + _columns = value; > + } > + } > +} > \ No newline at end of file > > http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/ > 336fac64/examples/flexjs/TableExample/src/main/flex/ > models/ProductsModel.as > ---------------------------------------------------------------------- > diff --git > a/examples/flexjs/TableExample/src/main/flex/models/ProductsModel.as > b/examples/flexjs/TableExample/src/main/flex/models/ProductsModel.as > new file mode 100644 > index 0000000..06a9b9b > --- /dev/null > +++ b/examples/flexjs/TableExample/src/main/flex/models/ProductsModel.as > @@ -0,0 +1,47 @@ > +/////////////////////////////////////////////////////////// > ///////////////////// > +// > +// 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 models > +{ > + import org.apache.flex.collections.ArrayList; > + > + public class ProductsModel > + { > + public function ProductsModel() > + { > + } > + > + private var _products:ArrayList = new ArrayList([ > + {name: "British Columbia", capital: "Vancouver", > country: "Canada"}, > + {name: "Coahuila", capital: "Saltilli", country: > "Mexico"}, > + {name: "Georgia", capital: "Atlanta", country: > "USA"}, > + {name: "Kyoto", capital: "Kyoto", country: > "Japan"}, > + {name: "Massachusetts", capital: "Boston", > country: "USA"}, > + {name: "New South Wales", capital: "Sydney", > country: "Australia"}, > + {name: "Quebec", capital: "Montreal", country: > "Canada"}, > + {name: "Shimane", capital: "Matsue", country: > "Japan"}, > + {name: "Victoria", capital: "Melbourne", country: > "Australia"}, > + {name: "Yucatan", capital: "Merida", country: > "Mexico"} > + ]); > + > + public function get products():ArrayList > + { > + return _products; > + } > + } > +} > \ No newline at end of file > >