royale-asjs icon indicating copy to clipboard operation
royale-asjs copied to clipboard

data binding in datagrid

Open sanjeev-rajput opened this issue 6 months ago • 4 comments

can someone please help me why data is not being updated in DataGrid below is the simple code. Log is showing that data is updated in arraylist but same is reflecting in datagrid

MXML-------

      <j:View xmlns:fx="http://ns.adobe.com/mxml/2009"
          xmlns:j="library://ns.apache.org/royale/jewel" xmlns:js="library://ns.apache.org/royale/basic"
          initComplete="init()"  style="background:transparent; border: none;" >
          	<j:beads>
              <js:ContainerDataBinding/>
          </j:beads>
          <fx:Script>
              <![CDATA[
            import views.actionitemviews.websocket.SocketService;
            import org.apache.royale.collections.ArrayList;
            [Bindable]
            private var _stockList:ArrayList = new ArrayList();
            private var _socketService:SocketService;
            private function init():void {
                _socketService = new SocketService();
                _socketService.addCAllBackFunction(onSocketData);   
                _socketService.connectWebSocket(SocketService.SUBSCRIBE_STOCK);
            }

            private function onSocketData(data:Object):void {
                if (data.type == "stock_update") {
                    //console.log("📈 Stock update:", data.payload);
                    updateFromJSON(data.payload); // we’ll structure this properly below
                } else {
                    console.log("📩 Other data received:", data);
                }
            }
            public function updateFromJSON(json:Array):void {
                var updatedSymbols:Object = {};
                for each (var obj:Object in json) {
                updatedSymbols[obj.symbol] = obj;

                // Check if stock already exists
                var found:Boolean = false;
                for (var i:int = 0; i < _stockList.length; i++) {
                    var existing:StockModel = _stockList.getItemAt(i) as StockModel;
                    if (existing.symbol === obj.symbol) {
                    existing.price = obj.price;
                    existing.timestamp = obj.timestamp;
                  // console.log(obj.symbol, obj.price, obj.timestamp)
                    found = true;
                    break;
                    }
                }
                // If not found, add new
                if (!found) {
                    _stockList.addItem(new StockModel(obj.symbol, obj.price, obj.timestamp));
                }
                }
                console.log('_stockList'+_stockList.getItemAt(0).price)
            }
            public function disposeMe():void {
                var obj:Object = {"type": "unsubscribe_stock"}
                _socketService.sendToSocket(obj);
                console.log('unsubscribe_stock')
                _socketService.disconnectWebSocket();
            }
        ]]>
    </fx:Script>
     <j:DataGrid id="dg1" dataProvider="{_stockList}" width="100%">
        <j:columns>
            <j:DataGridColumn dataField="symbol" label="Symbol"/>
            <j:DataGridColumn dataField="price" label="Price"/>
            <j:DataGridColumn dataField="timestamp" label="Time"/>
        </j:columns>
        </j:DataGrid>
  </j:View>

SocketModel.as

package views.actionitemviews.stockSocket {  
    [Bindable]
    public class StockModel {
      public var symbol:String;
      public var price:Number;
      public var timestamp:String;
      public function StockModel(symbol:String, price:Number, timestamp:String = "") {
        this.symbol = symbol;
        this.price = price;
        this.timestamp = timestamp;
      }
    }
  }

sanjeev-rajput avatar Jul 08 '25 12:07 sanjeev-rajput