Results 1 to 3 of 3

Thread: how to combine results from 2 different URLs into a single store

  1. #1

    Default how to combine results from 2 different URLs into a single store

    I have a grid, which has a JsonStore, loads data from a single URL.
    Now, I have to change it, because that URL is no longer appropriate.
    In fact that URL has been replaced by 2 different URLs.

    What I have to do now is invoke both URL seperately, do some processing of the result data (cross-referencing and consistency-checking between both sets of results) and then combine the records into the the grid's store for display.

    I have done the following:
    1. removed the URL from grid's store's config
    2. defined 2 new stores, which load from their own URLs
    3. overriden my grid's store's load method - to make it invoke the new stores' load methods and wait for them to both finish loading, then do the processing and insert all the results into the main grid's store.

    But, in overriding my main store's load method, I think I may have lost some of the original functionality.
    Is there a better way to do this, something like a 'beforeLoad' event that I can hook into....?
    I would want the event handler for this to do the stuff in my step 3 above, and then do whatever it needed to do in order to make everything look as if the store had just loaded its data from its URL like it used to.
    What exactly IS that? Or am I barking up the wrong tree here?

    Currently, I'm just overwriting the load method of my grid's store's INSTANCE (in the grid's constructor).
    I guess there is a better way to do this???

    PS. this is for Ext 3.

  2. #2
    Sencha Premium User mitchellsimoens's Avatar
    Join Date
    Mar 2007
    Location
    Gainesville, FL
    Posts
    40,379

    Default

    I would handle this server side personally to merge data.
    Mitchell Simoens @LikelyMitch

    Check out my GitHub:
    https://github.com/mitchellsimoens

    Posts are my own, not any current, past or future employer's.

  3. #3

    Default RESOLVED

    OK, so I took on board some suggestions, had a play, and came up with this... It works too

    Would also prefer to have done it server-side, but it was not an option in this case.
    Thanks everyone!

    Code:
    MyDataMergingGridClass = Ext.extend( MyGridBaseClass, 
    {
        constructor : function ( config ) 
        {
            // base ctor creates this.store 
            MyDataMergingGridClass.superclass.constructor.call( this, config );
            
            var store1 = this.store; 
            
            var store2 = new Ext.data.JsonStore(
            {        
                url: config.dataUrl2,
                root: config.dataRoot,
                id: config.dataIdField,
                fields: config.dataFields,            
                autoLoad: false
            });
    
            // only load store1 if store2 is the caller 
            store1.addListener( 'beforeload', function( thisStore, options ) 
            {
                if( options && (options.caller == store2) )
                {
                    return true; 
                }
                else
                {
                     store2.load();            
                     return false;
                }    
            }); 
    
    
            // when store2 has loaded, load store1
            store2.addListener( 'load', function( thisStore ) 
            {
                store1.load( { caller : thisStore } );
                return true;
            });
    
            // when store1 has loaded, we know that store2 has loaded too.
            // now we can merge the data (with optional pre- and post- processing)
            store1.addListener( 'load', function( thisStore ) 
            {
                thisStore.suspendEvents();
                
                // process stores BEFORE merge?
                if( (typeof config.processBeforeMergeStore1) == 'function' )
                    config.processBeforeMergeStore1.call( this, store1 );
                if( (typeof config.processBeforeMergeStore2) == 'function' )
                    config.processBeforeMergeStore2.call( this, store2 );
                
                // merge store2's records into store1 
                thisStore.loadData( store2.reader.jsonData, true ); // append
                
                // process the stores AFTER merge?
                if( (typeof config.processAfterMergeStore1) == 'function' )
                    config.processAfterMergeStore1.call( this, store1 );
                if( (typeof config.processAfterMergeStore2) == 'function' )
                    config.processAfterMergeStore2.call( this, store2 );
                
                thisStore.resumeEvents();
                thisStore.fireEvent( 'datachanged' );
                return true;
            });
    
         } //end: constructor
    });

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •