Joe Lennon

Rants, Raves & Recommendations

Archive for the ‘javascript’ tag

Explore MongoDB

without comments

In this article, you will learn about MongoDB, the open source, document-oriented database management system written in C++ that provides features for scaling your databases in a production environment. Discover what benefits document-oriented databases have over traditional relational database management systems (RDBMS). Install MongoDB and start creating databases, collections, and documents. Examine Mongo’s dynamic querying features, which provide key/value store efficiency in a way familiar to RDBMS database administrators and developers.

In recent years, we have seen a growing interest in database management systems that differ from the traditional relational model. At the heart of this is the concept of NoSQL, a term used collectively to denote database software that does not use the Structured Query Language (SQL) to interact with the database. One of the more notable NoSQL projects out there is MongoDB, an open source document-oriented database that stores data in collections of JSON-like documents. What sets MongoDB apart from other NoSQL databases is its powerful document-based query language, which makes the transition from a relational database to MongoDB easy because the queries translate quite easily.

Read the full article on IBM developerWorks at http://www.ibm.com/developerworks/opensource/library/os-mongodb4/index.html.

Written by Joe Lennon

June 22nd, 2011 at 8:47 am

Source Sencha Developer Conference – Day 2

with 3 comments

Day 2 of the Source Dev Sencha conference picked up right where the first day left off. I must credit the organizers on a fantastic choice of location and venue. The weather here in Split, Croatia has been consistently glorious since I arrived here. The hotel (Le Meridien Lav) is both an excellent place to stay and a great conference venue. Myself, Darragh Duffy, Jonathan Reardon and Martha Rotter enjoyed a really great meal last night in Taverna Bota Šare near the center of Split. We were promised by the concierge that it had the best seafood in Croatia and it really lived up to the high praise.

Before diving into my thoughts on day 2, I had better mention the party last night. My thoughts on conferences are that the best networking is done over a beer, and last night was no exception to that rule. Everything kicked off in a bar right next to the hotel with a steady flow of beer going strong for the night. There were some camera guys around so I’m sure some footage of our antics will surface before too long. I had the pleasure of enjoying some late night beers with Nils Dehl, Steffen Kamper, Aditya Bansod, Denis and Ian from EMC (sorry guys didn’t catch your surnames) and Ed Spencer. Kudos to the Sencha guys for resisting the urge to accept our random pleas for various features and products, they must have been well trained in advance of this event! ;-) I heard Ed respond with “No comment” on more than one occasion – he’d make a great politician!

A little hungover and very tired, today’s agenda was a great remedy for any headache. Things kicked off bright and early with Brian Moeskau giving an overview of how to migrate applications to ExtJS 4. Brian also held a practical workshop on the same topic later in the morning. Sencha deserve a lot of credit for their work on making this process as painless as possible. The compatibility layer is going to be hugely important for a lot of existing ExtJS developers, and the fact that both versions can play nice with each other means that companies like the one I work for can start using ExtJS 4 pretty much straight away. Brian’s excellent blog post on migration is well worth looking at. You can find it at http://www.sencha.com/blog/ext-js-3-to-4-migration/.

Next up was another presentation from James Pearce, this time on working with PhoneGap. Up until now our company has deployed our applications solely over the Web, but it looks like we will inevitably need to deploy to devices natively. Thankfully Sencha Touch and PhoneGap are a match made in heaven, and the process is pretty painless when you consider just how difficult it would be to create separate applications for each target device/operating system. James posted a screencast showing the final demo from his presentation, which can be found at http://vimeo.com/23358554.

Before lunch there was a schedule change, with Jay Garcia‘s workshop on JavaScript classes and scoping being moved forward. I have read articles, blog posts and even books that try to explain JavaScript’s prototypal inheritance and scope, none of which compare to Jay’s coverage this morning. I think many developers in the room had an “A-ha” moment when Jay explained just how the “this” keyword really works in JavaScript. Watching Jay at work today has given me the urge to really dig deep and gain a stronger understanding of just how ExtJS hangs together.

After lunch, George White (aka Animal) gave a great workshop session on using JavaScript debugging tools such as Firebug for Firefox, WebKit Developer Tools, JSLint and so on. Grgur Grisogono, who organized the conference, corrected a missing semi-colon in a code example, resulting in George nicknaming him “Mr. Lint” (Edit: Damian pointed out that it was actually Jay Garcia who gave Grgur this title in his earlier workshop, thanks Damian!). What I found best about this session was the numerous tips and common issues to look out for when developing ExtJS or Sencha Touch applications. At the end of the session I got the chance to meet James Pearce, and enjoyed briefly talking to him about how we’re using Sencha’s products in our company.

Unfortunately I didn’t make it to Steffen Kamper’s talk on Ext.Direct, but returned in time for Grgur’s closing keynote, which uniquely featured him jumping around and cheering on stage, much to the delight of the audience. Grgur thanked a lot of people in the keynote, but I think he deserves thanks for his hard work and effort into organizing such a successful event.

I wish I could tell you that that’s it for today and I’ll be back to wrap up the boat trip tomorrow, but alas I must return to Cork tomorrow, which involves an early flight to London Gatwick in the morning. It’s been a great conference, I’ve learned a lot and I’ve met many great people. Hopefully I’ll get to meet you all again in Austin, TX in October at SenchaCon.

For more coverage on the conference, see Darragh Duffy’s blog post which covers the entire two days. The URL is http://www.darraghduffy.ie/?p=294.

Written by Joe Lennon

May 6th, 2011 at 3:42 pm

Basics of HTML5 Local Storage

with 4 comments

This post is designed to be a no-frills introduction to using HTML5 local storage. It assumes that you are using the latest version of Mozilla Firefox and the Firebug plug-in.

1. Checking for browser support

Open the Firebug console and enter the following command:

'localStorage' in window;

You should see the following output:

>>> 'localStorage' in window;
true

2. Storing data

HTML5 local storage stores data in named key/value pairs. The key must be a String, and the value can be any JavaScript data type, although it will be stored as a String. To store data, you use localStorage.setItem:

localStorage.setItem("name", "Joe");

Alternatively, you can use the square bracket syntax to store data:

localStorage["age"] = 25;

Or, you can use dot notation if you prefer:

localStorage.location = "Ireland";

If the key you use already exists, the existing key/value pair will be overwritten without warning.

3. Retrieving data

To retrieve data you can use getItem:

localStorage.getItem("name");

Output:

>>> localStorage.getItem("name");
"Joe"

Alternatively, you can also use square bracket syntax:

localStorage["age"];

Output:

>>> localStorage["age"];
"25"

Or, you can use dot notation:

localStorage.location;

Output:
>>> localStorage.location;
"Ireland"

4. Removing data

There are two ways to remove data in local storage. Firstly, you can delete a single key:

localStorage.removeItem("age");

Alternatively, you can clear all local storage data as follows:

localStorage.clear();

5. Finding data

You can get the number of key/value pairs stored in local storage using the length property:

localStorage.length;

To get the name of a key at a particular index, you can use the key method:

localStorage.key(0);

You can combine the two to iterate over the local storage data as follows:

for(var i=0, len=localStorage.length; i<len; i++) {
    var key = localStorage.key(i);
    var value = localStorage[key];
    console.log(key + " => " + value);
}

6. Events

You can keep track of changes to local storage using event handling. The “storage” event is fired any time data changes in local storage. This event is fired by the window object. For example (Note: this won’t work in IE):

window.addEventListener("storage", function(e) {
    console.log("Local storage was modified");
}, false);

The above will log a message to the Firebug console any time that the local storage data is modified (when adding, removing or replacing keys, clearing a non-empty storage, etc). At the time of writing, Firefox 3.6 did not include support for the storage event object properties key, oldValue, newValue and url.

7. Summary

So there you have it, a quick introduction to using HTML local storage. If you have any questions, leave a comment.

Written by Joe Lennon

February 11th, 2011 at 12:37 pm

Flex and JavaScript

without comments

I’m currently working on a Web application project that is primarily coded in JavaScript. As part of the project however, I needed to use a Flex component for part of the application. I would also need a series of components (search boxes, trees and grids) to interact with this component. At first, it seemed to make sense to do all of this in Flex. However, when it comes to client-side development, we’re primarily a JavaScript shop, and would prefer to keep the amount of Flex we write to a minimum. Also, from a styling perspective, our existing JavaScript components would fit in better with our overall application, so it made much more sense for us to use them rather than Flex’s trees, grids and so on. Of course, this raised a problem – how do we communicate between JavaScript and Flex?

Fortunately, this is actually very straightforward. To prove the concept, I decided to write up a basic application that would allow you to pass messages between Flex and JavaScript components and output them on the screen. Here is a screenshot of this application in action (click for a larger image):

Sample Project in action

Sample Project in action

So on the left hand side of the application, there is a standard HTML input field, button element and a read-only textarea element. The input field will allow the user to write a message to be passed to the Flex application, which gets sent when the user clicks the “Send to Flex” button. The textarea field will be updated with any messages that are sent to JavaScript by Flex. On the right-hand-side, you have the same thing, but this time it will allow you to enter a message to send to JavaScript from Flex, and has an area where messages sent by JavaScript to Flex will be shown.

Let’s walk through how I did this. It’s worth pointing out at this point that I used Flash Builder 4 and the Flex 4 SDK to create this application. If you have a different setup, you may need to change your code to suit your version.

In Flash Builder, create a new Flex Project, and call it TestJSFlex. Let’s start off with the Flex application interface. You can use the Design view if you wish, but for a simple application like this, it’s fairly straightforward to create everything in code. Just before the closing </s:Application> tag in your source code, add the following three lines of code:

<s:TextInput x="2" y="2" width="310" id="flexInput"/>
<s:Button x="320" y="3" width="100" label="Send to JS" />
<s:TextArea x="2" y="32" width="416" height="200" id="flexMessages" editable="false"/>

While you’re at it, add the following attributes to your opening <s:Application> element:

width="440" height="255"

That’s our Flex application user interface done. Pretty simple, huh? Next, let’s change the HTML template that Flash Builder produces to add some basic HTML elements for the JavaScript side of our application to use. In “Package Explorer” (usually at the top left hand side of Flash Builder), your project folder should contain a few subfolders: src, Flex 4.0, bin-debug, html-template and libs. Expand the html-template folder and you should see a file named index.template.html. Right-click this file, and from the context menu select “Open With -> Text Editor”. The file should now open in a new editor tab in the main part of the IDE. In this file, locate the following section of HTML code:

<div id="flashContent">
    <p>
        To view this page ensure that Adobe Flash Player version
        ${version_major}.${version_minor}.${version_revision} or greater is installed.
    </p>
    <script type="text/javascript">
        var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://");
        document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='"
              + pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif' alt='Get Adobe Flash player' /></a>" );
    </script>
</div>

This is basically the element where the Flex application will appear on the HTML page. We’re going to wrap it in a <div> container and add a section before it with a HTML form:

<div id="container">
    <h1>Flex and JavaScript</h1>
    <div class="section">
        <h2>JavaScript:</h2>
        <input type="text" id="js_value" />
        <input type="button" id="js_button" value="Send to Flex" />
        <br />
        <textarea id="js_messages" readonly></textarea>
    </div>
    <div class="section clearfix">
        <h2>Flex:</h2>
        <div id="flashContent">
            <p>
                To view this page ensure that Adobe Flash Player version
                ${version_major}.${version_minor}.${version_revision} or greater is installed.
            </p>
            <script type="text/javascript">
                var pageHost = ((document.location.protocol == "https:") ? "https://" :    "http://");
                document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='"
                     + pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif' alt='Get Adobe Flash player' /></a>" );
           </script>
       </div>
    </div>
</div>

In the code above, we have added a few HTML form elements: a text field with the ID js_value, a button with the ID js_button and a read-only textarea with the ID js_messages. To make the whole thing look right, we’re going to add some CSS properties which will define the layout and size of the elements. In index.template.html, locate the CSS section of the code near the top of the file, which by default should contain:

<style type="text/css" media="screen">
    html, body { height:100%; }
    body { margin:0; padding:0; overflow:auto; text-align:center; background-color: ${bgcolor}; }
    #container { width: 900px; margin: 0px auto; text-align: left; }
    #flashContent { display:none; }
</style>

Modify this so that it contains:

<style type="text/css" media="screen">
    html, body { height:100%; }
    body { margin:0; padding:0; overflow:auto; text-align:center; background-color: ${bgcolor}; }
    #container { width: 900px; margin: 0px auto; text-align: left; }
    #flashContent { display:none; }
    h1, h2 { font-family: Helvetica, Arial, sans-serif; }
    h2 { margin-top: 0px; }
    .section { width: 450px; float: left; }
    .clearfix:after {
        content: ".";
        display: block;
        height: 0;
        clear: both;
        visibility: hidden;
    }
    #js_value { width: 310px; }
    #js_button { width: 100px; }
    #js_messages { width: 416px; height: 195px; margin-top: 8px; }
</style>

The CSS properties should be fairly self-explanatory. Basically, we have a container div 900 pixels wide, with two 450px sections inside it that appear side by side (using the float property), with a clearfix put in place so everything looks right in older browsers (just a note – I haven’t checked if this looks OK in anything other than Firefox 3.6, so don’t flame me if it doesn’t). Finally, we add some widths and heights to the form fields so they match up nicely with the Flex components.

That’s the UI section of the application taken care of. Next, let’s actually make Flex and JavaScript talk to each other. First, let’s get Flex talking to JavaScript. In the TestJSFlex.mxml file, just above where you entered the <s:TextInput> and other components a while back, add the following code:

<fx:Script>
    <![CDATA[
        public function sendToJS():void {
            ExternalInterface.call("receiveFromFlex", flexInput.text);
        }
    ]]>
</fx:Script>

This script block simply defines a single function named sendToJS. This function uses the ExternalInterface.call function to call a JavaScript function. The first parameter here is the name of the JavaScript function you want to call, in our case receiveFromFlex, and this is followed by any parameters you want to pass to JavaScript. Here, we have simply passed the current value of the text property of our text box with the id flexInput. Next, find the following line of code near the bottom of TestJSFlex.mxml:

<s:Button x="320" y="3" width="100" label="Send to JS" />

Let’s add a click event handler to this button, which will call the sendToJS function any time a user presses the button:

<s:Button x="320" y="3" width="100" label="Send to JS" click="sendToJS()" />

That’s everything that we need to do on the Flex side to call a JavaScript function. Of course, this is pretty much useless unless we actually declare the JavaScript function it is trying to call, so let’s hop over to index.template.html and create that now. Just before the closing </head> tag in this file, add the following code:

<script type="text/javascript">
    function receiveFromFlex(str) {
        var msgs = document.getElementById("js_messages");
        msgs.value += 'Flex says: '+str+'\n';
    }
</script>

This function simply accepts a string value as a parameter, and appends it (followed by a new line) to the element with the ID js_messages (the textarea element). Save all your files and run the application by pressing the green Play/Run button in the Flash Builder toolbar. At this point, you should be able to enter a message in the input box on the right hand side (the Flex side) and hit “Send to JS”. This message should then appear on the left hand side. That was pretty easy, huh? Ok, now all that’s left for us to do is implement the reverse scenario – sending messages from JavaScript to Flex.

In the previous section, you created a <script> block in the index.template.html file. Inside this block, just below the receiveFromFlex function, add the following code:

function sendToFlex() {
    var flexApp = document.getElementById("${application}");
    flexApp.sendToFlex(document.getElementById("js_value").value);
}

window.onload = function() {
    var btn = document.getElementById("js_button");
    btn.onclick = sendToFlex;
}

The first function, sendToFlex, gets a handle to the Flex application object using document.getElementById. You’ll notice that the ${application} template variable is used. This is recommended so that if you change the name of your Flex application, you won’t need to change the value in your template file. The function then calls the sendToFlex function in the Flex application object. Finally, we attach this function as an event handler to the HTML button element with the ID js_button. That’s it on the JavaScript side of things. Save index.template.html and jump back to TestJSFlex.mxml. Now, let’s add the code necessary to handle this on the Flex side of things. Inside the <fx:Script> block, below the sendToJS function, add the following two functions:

public function initApp():void {
    ExternalInterface.addCallback("sendToFlex", receiveFromJS);
}

public function receiveFromJS(str:String):void {
    flexMessages.text += 'JS says: '+str+'\n';
}

The first function, initApp, uses the ExternalInterface.addCallback function to map a JavaScript function to a Flex function. Here, we tell the sendToFlex JavaScript function callback to execute the Flex function named receiveFromJS. This function accepts a String parameter and appends it to the <s:TextArea> element followed by a newline. The final piece of the puzzle is to wire up the initApp function to be called when the Flex application has finished loading. In your <s:Application> element, add the attribute

creationComplete="initApp()"

and you’re done! You can now run the application and enter messages in the HTML input field, which will appear in the Flex message box when you hit “Send to Flex”. Easy as pie! For reference purposes, here are the full listings for the two source files we’ve worked with in this post.

TestJSFlex.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
           xmlns:s="library://ns.adobe.com/flex/spark"
           xmlns:mx="library://ns.adobe.com/flex/mx" width="440" height="255"
           creationComplete="initApp()">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            public function sendToJS():void {
                ExternalInterface.call("receiveFromFlex", flexInput.text);
            }

            public function initApp():void {
                ExternalInterface.addCallback("sendToFlex", receiveFromJS);
            }

            public function receiveFromJS(str:String):void {
                flexMessages.text += 'JS says: '+str+'\n';
            }
        ]]>
    </fx:Script>
    <s:TextInput x="2" y="2" width="310" id="flexInput"/>
    <s:Button x="320" y="3" width="100" label="Send to JS" click="sendToJS()" />
    <s:TextArea x="2" y="32" width="416" height="200" id="flexMessages" editable="false"/>
</s:Application>

index.template.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- saved from url=(0014)about:internet -->
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <!--
    Smart developers always View Source.

    This application was built using Adobe Flex, an open source framework
    for building rich Internet applications that get delivered via the
    Flash Player or to desktops via Adobe AIR.

    Learn more about Flex at http://flex.org
    // -->
    <head>
        <title>${title}</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <!-- Include CSS to eliminate any default margins/padding and set the height of the html element and
             the body element to 100%, because Firefox, or any Gecko based browser, interprets percentage as
             the percentage of the height of its parent container, which has to be set explicitly.  Initially,
             don't display flashContent div so it won't show if JavaScript disabled.
        -->
        <style type="text/css" media="screen">
            html, body { height:100%; }
            body { margin:0; padding:0; overflow:auto; text-align:center; background-color: ${bgcolor}; }
            #container { width: 900px; margin: 0px auto; text-align: left; }
            #flashContent { display:none; }
            h1, h2 { font-family: Helvetica, Arial, sans-serif; }
            h2 { margin-top: 0px; }
            .section { width: 450px; float: left; }
            .clearfix:after {
                content: ".";
                display: block;
                height: 0;
                clear: both;
                visibility: hidden;
            }
            #js_value { width: 310px; }
            #js_button { width: 100px; }
            #js_messages { width: 416px; height: 195px; margin-top: 8px; }
        </style>

        <!-- Enable Browser History by replacing useBrowserHistory tokens with two hyphens -->
        <!-- BEGIN Browser History required section ${useBrowserHistory}>
        <link rel="stylesheet" type="text/css" href="history/history.css" />
        <script type="text/javascript" src="history/history.js"></script>
        <!${useBrowserHistory} END Browser History required section -->

        <script type="text/javascript" src="swfobject.js"></script>
        <script type="text/javascript">
            <!-- For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection. -->
            var swfVersionStr = "${version_major}.${version_minor}.${version_revision}";
            <!-- To use express install, set to playerProductInstall.swf, otherwise the empty string. -->
            var xiSwfUrlStr = "${expressInstallSwf}";
            var flashvars = {};
            var params = {};
            params.quality = "high";
            params.bgcolor = "${bgcolor}";
            params.allowscriptaccess = "sameDomain";
            params.allowfullscreen = "true";
            var attributes = {};
            attributes.id = "${application}";
            attributes.name = "${application}";
            attributes.align = "middle";
            swfobject.embedSWF(
                "${swf}.swf", "flashContent",
                "${width}", "${height}",
                swfVersionStr, xiSwfUrlStr,
                flashvars, params, attributes);
            <!-- JavaScript enabled so display the flashContent div in case it is not replaced with a swf object. -->
            swfobject.createCSS("#flashContent", "display:block;text-align:left;");
        </script>

        <script type="text/javascript">
            function receiveFromFlex(str) {
                var msgs = document.getElementById("js_messages");
                msgs.value += 'Flex says: '+str+'\n';
            }

            function sendToFlex() {
                var flexApp = document.getElementById("${application}");
                flexApp.sendToFlex(document.getElementById("js_value").value);
            }

            window.onload = function() {
                var btn = document.getElementById("js_button");
                btn.onclick = sendToFlex;
            }
        </script>
    </head>
    <body>
        <!-- SWFObject's dynamic embed method replaces this alternative HTML content with Flash content when enough
              JavaScript and Flash plug-in support is available. The div is initially hidden so that it doesn't show
              when JavaScript is disabled.
        -->
        <div id="container">
            <h1>Flex and JavaScript</h1>
            <div class="section">
                <h2>JavaScript:</h2>
                <input type="text" id="js_value" />
                <input type="button" id="js_button" value="Send to Flex" />
                <br />
                <textarea id="js_messages" readonly></textarea>
            </div>
            <div class="section clearfix">
                <h2>Flex:</h2>
                <div id="flashContent">
                    <p>
                        To view this page ensure that Adobe Flash Player version
                        ${version_major}.${version_minor}.${version_revision} or greater is installed.
                    </p>
                    <script type="text/javascript">
                        var pageHost = ((document.location.protocol == "https:") ? "https://" :    "http://");
                        document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='"
                                + pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif' alt='Get Adobe Flash player' /></a>" );
                    </script>
                </div>
            </div>
        </div>

        <noscript>
            <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="${width}" height="${height}" id="${application}">
                <param name="movie" value="${swf}.swf" />
                <param name="quality" value="high" />
                <param name="bgcolor" value="${bgcolor}" />
                <param name="allowScriptAccess" value="sameDomain" />
                <param name="allowFullScreen" value="true" />
                <!--[if !IE]>-->
                <object type="application/x-shockwave-flash" data="${swf}.swf" width="${width}" height="${height}">
                    <param name="quality" value="high" />
                    <param name="bgcolor" value="${bgcolor}" />
                    <param name="allowScriptAccess" value="sameDomain" />
                    <param name="allowFullScreen" value="true" />
                <!--<![endif]-->
                <!--[if gte IE 6]>-->
                    <p>
                        Either scripts and active content are not permitted to run or Adobe Flash Player version
                        ${version_major}.${version_minor}.${version_revision} or greater is not installed.
                    </p>
                <!--<![endif]-->
                    <a href="http://www.adobe.com/go/getflashplayer">
                        <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash Player" />
                    </a>
                <!--[if !IE]>-->
                </object>
                <!--<![endif]-->
            </object>
        </noscript>
    </body>
</html>

If you’d prefer to just take the sample Flex project, you can download a zip file of it below:

TestJSFlex.zip (2,286 KB)

Written by Joe Lennon

November 26th, 2010 at 4:39 pm

Build Ext JS extensions and plug-ins

without comments

Ext JS is a comprehensive JavaScript framework that includes a vast collection of features, including cross-browser-compatible JavaScript helper utilities for DOM traversal and manipulation and data object stores. It also handles Ajax and direct web remoting, has an impressive collection of UI controls and widgets, charts and graphs, a powerful data grid control, and much, much more.

When developing applications using Ext JS, or indeed any JavaScript library or framework, you can be sure that you are going to need functionality that isn’t included out-of-the-box, or is present but doesn’t work quite the way you want it to. Thankfully, Ext JS includes a powerful class and component ecosystem that makes it easy to extend existing features or build new components entirely. In this article, we will explore this extensibility, specifically looking at the concepts of extensions and plug-ins. You will learn what each of these concepts means and what is different between the two. You will then see how to build your own extensions and plug-ins and how to source existing plug-ins built by other developers for use in your own applications, saving you from reinventing the wheel.

Read this article on IBM developerWorks at http://www.ibm.com/developerworks/library/wa-extjs/

Written by Joe Lennon

November 23rd, 2010 at 6:10 pm