Ext.Format extension for thousands separator formatting

Ext General, JavaScript No Comments »

A simple function, the basis of was in the public domain (see comments) to format a number with thousand separators.

 

Ext.apply(Ext.util.Format,{
 
    decimalSeparator : '.',
    thousandSeparator : ',',
        
    /* Adapted from http://www.mredkj.com/javascript/nfbasic.html, 
     * Public Domain, without copyright, and can be used without restriction: 
     * see http://www.mredkj.com/legal.html
     */    
    asThousands : function(value)
    {
        value = parseInt(value,10) + '';
        var x = value.split(this.decimalSeparator);
        var x1 = x[0];
        var x2 = x.length > 1 ? this.decimalSeparator + x[1] : '';
        var rgx = /(\d+)(\d{3})/;
        while (rgx.test(x1)) {
            x1 = x1.replace(rgx, '$1' + this.thousandSeparator + '$2');
        }
        return x1 + x2;
    }
});

Non-record based Json calls across Domains with Ext

Ext General 1 Comment »

From a forum question I posted at Ext: http://extjs.com/forum/showthread.php?t=5430

I am trying to make a call to a webpage that returns a json object that is hierarchical in nature and not record based so as far as I am aware, jsonreader / datareader are not suitable.

The Server returns something looking like this:

   1: (
   2:     { 
   3:     children: [
   4:         { 
   5:         id : "1", 
   6:         name : "Dim Item 1", 
   7:         children : [
   8:             { 
   9:             id : "1.0", 
  10:             name : "Dim Item 1.0"
  11:             },
  12:             { 
  13:             id : "1.1", 
  14:             name : "Dim Item 1.1"
  15:             } 
  16:         ]
  17:         } 
  18:     ]
  19:     }
  20: );

Where each item can have children in a hierarchy. (I am not trying to use this data with the Ext Tree by the way)

To complicate matters the server providing the data is hosted on a different port, so I have to use the Ext.data.ScriptTagProxy to get the data, which is successful. I had a few teething problems until I realized you had to wrap the json object returned with the callback function name.
However, with my limited understanding and debugging the code, the Ext.data.ScriptTagProxy requires a reader to be supplied, but all I want in this instance is the object.

This is the client side code:

   1: function GetData()
   2: {
   3:         var url = "http://localhost:4855/largeJasonHierarchy.aspx";
   4:         var conn = new Ext.data.ScriptTagProxy({
   5:             url: url
   6:         });
   7:         
   8:         var reader = new Ext.data.ObjectReader();
   9:         conn.load({},reader,GotData);
  10: }
  11:  
  12:  
  13:  
  14: function GotData(x)
  15: {
  16:     alert(x);
  17: }

As a reader is required, I had to hack a copy of the jsonReader to create a ObjectReader that simply returns the object and does not process it.

ObjectReader.js

   1: Ext.data.ObjectReader = function(meta, recordType){
   2:     Ext.data.ObjectReader.superclass.constructor.call(this, meta, recordType);
   3: };
   4: Ext.extend(Ext.data.ObjectReader, Ext.data.DataReader, {
   5:  
   6:     readRecords : function(o){
   7:         return o;
   8:     }
   9: });

This all works, but I can’t help feeling like I’ve missed something crucial in the Ext library. Could someone with more experience than me confirm I have gone down the correct route, or let me know if there is a better way of getting json objects back in any format. (cross domain of course)
One concern, is that I have seen articles saying that any json data passed back from a server should be run through a regex parser to check that there are no functions /etc being injected in the data packets (anti-hacking and the likes) I’m not yet sure how I would fit this into the ObjectReader.
Thanks for any help.

 


 Response by Animal, notice the way he has used the Ext override to override the default implementation on ScriptTagProxy.handleResponse. 

As it stands, that’s the best way.
I think an enhancement request could be in order. If you don’t pass a reader, it should skip the call to reader.readRecords, and just call your callback passing the returned object.

That way, the following would work.

   1: conn.load({},null,GotData);

 

by adding:

   1: Ext.override(Ext.data.ScriptTagProxy, {
   2:     handleResponse : function(o, trans){
   3:         this.trans = false;
   4:         this.destroyTrans(trans, true);
   5:         var result;
   6:         if (trans.reader) {
   7:             try {
   8:                 result = trans.reader.readRecords(o);
   9:             }catch(e){
  10:                 this.fireEvent("loadexception", this, o, trans.arg, e);
  11:                 trans.callback.call(trans.scope||window, null, trans.arg, false);
  12:                 return;
  13:             }
  14:         } else {
  15:             result = o;
  16:         }
  17:         this.fireEvent("load", this, o, trans.arg);
  18:         trans.callback.call(trans.scope||window, result, trans.arg, true);
  19:     }
  20: });

Javascript Namespaces

Ext General, JavaScript 1 Comment »

 One of the big problems as the number of toolkits that you can use in your RIA increases is variable collision.  Constructing your classes and widgets in the form of a namespace reduces the risk that the global variables you are using will have been used by someone else.  The following code demonstrates a pattern for defining a namespace utilizing objects to create an object hierarchy for your namespace.

   1: var MyNamespace = {};
   2: MyNamespace.test = function(){
   3:         alert("MyNamespace.test");
   4: };
   5:  
   6: MyNamespace.common = {};
   7: MyNamespace.common.test = function(){
   8:         alert("MyNamespace.common.test");
   9: };
  10:  
  11: MyNamespace.utilities = {};
  12: MyNamespace.utilities.test = function(){
  13:         alert("MyNamespace.utilities.test");
  14: };
  15:  
  16: MyNamespace.common.dataaccess = {};
  17: MyNamespace.common.dataaccess.test = function(){
  18:         alert("MyNamespace.common.dataaccess.test");
  19: };
  20:  
  21:  

 

Notice that before the namespace can be assigned variables and functions, it needs to be initialized to an empty object.

This allows you to make calls like:

MyNamespace.common.dataaccess.test();

However, it is important that you only initialize the name space object once, and it is important that the full path of namespace objects be declared before you try and assign functions and properties to them.

If you want to separate your name space implementation across separate files, then you really need to check that all the stages of the namespace are assigned and create them if not. e.g.

   1: if(!MyNamespace) MyNameSpace = {};
   2: if(!MyNamespace.common ) MyNameSpace.common = {};
   3: if(!MyNamespace.common.dataaccess) MyNameSpace.common.dataaccess = {};

 

You can imagine that if your namespaces get quite deep, you start having quite a lot of code at the start of each of your Javascript files just to ensure the namespace objects are created.  There is however a very nice solution in the Ext library which helps you with this:

Ext.namespace() - this takes a variable list of namespace names and creates the objects for you if they don’t exist.

e.g.

   1: Ext.namespace("MyNamespaces","MyNamespace.common","MyNamespace.common.dataaccess");

Various getting started with JavaScript resources (relevant to Ext)

Ext General 1 Comment »

A must view for the programmer starting out with JavaScript : http://developer.yahoo.com/yui/theater/

Have a look at the  Douglas Crockford — “The JavaScript Programming Language” 4 part video.

Private or Public ? the in’s and out’s of  declaring private and public methods and properties in JavaScript: http://phrogz.net/JS/Classes/OOPinJS.html

Inheritance in JavaScript : http://kevlindev.com/tutorials/javascript/inherita…

Ext - Creating a simple Project Template

Ext General 2 Comments »

What are the key files needed to get a project up and running using Ext?  The following lists the bare requirements to get ext running.

  1. Download and extract Ext to a folder :[Ext Download].
  2. Create a folder to store your project in.
  3. From the [Ext Download] folder, copy ext-all-debug.js (or ext-all.js if you want the release version) to the project folder.
  4. Ext can run with *YUI (Yahoo UI), Prototype/scriptaculous, or JQuery.  Copy all the files found in the [Ext Download]\adapter\[your lib choice] folder to the project folder. 
  5. Finally copy to the project folder CSS and images folders found in the [Ext Download]\resources folder.

* My first misconception about Ext was that I needed to install the appropriate library (prototype / scriptaculous / YUI / JQuery) as well as Ext to get it to run.  The Ext distribution has all the files and source from those libraries that it needs to run. E.g. for prototype, it’s all wrapped up in the one file ext-prototype-adapter.js.

* Actually as efege commented Ext includes all the necessary files from YUI.  To run with prototype or jQuery you need to download and include these in your script block as specified by the respective library.  (I would expect that these need to be included before the ext and ext adapter script files)

You now have the basic libraries ready for use, add a html file and add the following script sections to the <head>.  Note the order, it is important.  In this case I have opted for the YUI adapter.  (replace the two YUI script includes with the appropriate file name for the other libraries)

        <script src="yui-utilities.js" type="text/javascript"></script>
        <script src="ext-yui-adapter.js" type="text/javascript"></script>
        <script src="ext-all-debug.js" type="text/javascript"></script>
        <link href="./css/ext-all.css" media="screen" rel="Stylesheet" type="text/css" />
WP Theme &Design by minus19.com & Icons
Entries RSS Comments RSS Log in