EXTJS--使用Ext.define自定義類


Javascript自定義類

var person = function(name,age){

  this.Name = "";

  this.Age = 26;

  this.Say = function(msg){

    alert(this.Name + " Says : " + msg);

  }

  this.init = function(name,age){

    this.Name = name;

    this.Age = age;

  }

  this.init(name, age);

}

在這段代碼中,我們定義了Person類,它具有Name 和 Age 兩個屬性,具有 Say 和 init 公有方法。當類創建的時候,會定義通過調用init方法實現類的初始化(所以init方法可以看作是類的構造函數)。我們看一下該類的用法:

var Tom = new person("Tom", 26);

Tom.Say("hello!");

運行效果如圖:

ExtJS 中自定義類

Ext.define("Person", {

  Name : '';

  Age : 0;

  Say : function(msg){

    Ext.Msg.alert(this.Name + " Says: " + msg);

  },

  constructor : function(name, age){

     this.Name = name;

     this.Age = age;

  }

});

在這段代碼中,我們使用了Ext.define方法自定義一個Person類,它同樣具有Name 和 Age 屬性,具有Say 方法,constructor 則的它的構造函數,有了專用的構造函數,我們就省去了寫init方法的代碼,直接在構造函數中完成對類的初始化,它的使用方法沒有改變,仍然是之前的代碼:

var Tom = new Person("Tom", 26);

Tom.Say("Hrllo!");

看一下運行效果:

ExtJS 中類的繼承

ExtJS 允許對現有的類進行擴展,其擴展可以通過繼承來實現。接下來我們就對剛剛使用ExtJS定義的Person類進行繼承,定義一個Developer類,它繼承自Person,同時還擁有Coding方法,代碼如下:

Ext.define("Developer", {

   extend : Person,

   Coding : function(code){

     Ext.Msg.alert(this.Name + "  正在編碼 : " + code);

   },

   constructor : functuion(){

      this.callParent(arguments);

   }

});

 從代碼中可看出,ExtJS 使用 extend來實現繼承。我們為Developer 類添加了Coding 方法,這是我們對Person類進行的擴展。在構造函數中,通過調用this.callParent 方法,實現對屬性的初始化。需要說明的是,如果此處只調用了父類的構造方法,則可以省略掉,ExtJS 會自動為我們調用父類的構造函數。所以我們此處的代碼可以進行簡化:

Ext.define("Developer", {

    extend : Person,

    Coding : function(code){

         Ext.Msg.alert(this.Name + "  正在編碼 :"  + code);

    }

});

需要注意的是,如果你在子類中使用了構造函數,ExtJS 則不會再自動調用父類的構造函數。

我們要使用Developer類,代碼很簡單:

var Bill = new Developer("Bill", 26);

Bill.Coding("int num1 = 0");

運行效果如圖:

ExtJS 中類的選項 - config

首先看一個例子,我們在ExtJS中定義一個Window對象,代碼如下:

var win = Ext.create("Ext.window.Window", {

   title : "示例窗口",

   width : 300,

   hidth : 200

});

win.show();

在上面的代碼中,我們通過Ext.create方法創建了一個Window 對象,Ext.create 方法的第一個參數是類名,第二個參數是類的選項,它是一個JSON格式的對象,用來初始化Window對象。我們的窗口運行如下:

 

試想一下,如果我們的類中有幾十個屬性,那么我們使用構造函數就要傳入幾十個參數來對它完成初始化,這是一件很恐怖的事情。還好ExtJS 為我們提供了這種便利,我們可以在定義類的時候為它添加配置項,然后調用ExtJS 內置的方法完成初始化,並可以生成訪問器(類似於C#里面的get和set方法)。

我們來修改Person類,使它可以通過config初始化:

Ext.define("Person"  {

   config : {

     Name : '',

    Age : 0

   },

  Say : function(msg){

     Ext.Msg.alert("this.Name" + " Says : " + msg);

  },

  constructor : function(config){

      this.initConfig(config);

  }

});

 我們在類的定義中添加了config項,將需要在配置中完成的屬性添加在里面,而在構造函數中,我們通過調用this.initConfig方法完成對config的初始化。看一下用法:

var Tom = Ext.create("Person", {

   Name : 'Tom',

  Age : 26

});

Tom.Say("hello");

我們在定義Person類對象的時候,使用Ext.create方法,傳入類名Person以及配置項,然后調用Tom的Say方法,運行效果如圖:

除了代碼更加清晰簡潔以外,ExtJS 還為我們生成了訪問器,我們可以通過下面的方式訪問Tom的屬性:

Tom.setAge(20);

alert(Tom.getAge());

ExtJS 生成了get、set方法,我們可以通過這樣的方式來訪問對象的屬性。

 

ExtJS 中類的別名 - alias

在我們查看ExtJS API 的時候,在左側常會有這樣的說明:

紅色方框圈出的部分是這個類的別名,它對應類的全稱是 Ext.window.Window,由此可以看出別名更加簡單,容易記憶和書寫。我們在實例化類的時候,可以使用別名來替代類名全稱,例如我們之前定義的win對象,他的代碼可以修改為:

var win = Ext.create("Ext.Window" {

   title : "示例窗口",

   width : 200,

   height : 300

});

win.show();

看完例子,你是否也想在自定義類中實現別名呢?為了更好的演示別名,我們對Person類做一個簡單的修改,將類名的全稱修改為MyApp.Person(相當於為Person添加了命名空間):

Ext.define("MyApp.Person",{

   config : {

      Name : '',

      Age : 0

   },

   Say : function(msg){

       Ext.Msg.alert(this.Name + " Says : " + msg);

   },

   constructor : function(config){

    this.initConfig(config);

   }

});

我們只修改了第一行,其它代碼不變。這個時候我們使用之前的代碼實例化Person類:

var Tom = Ext.create("Person", {

   Name : 'Tom',

   Age : 26

});

Tom.Say("Hello");

刷新頁面,很不幸的是我們得到了兩個錯誤:

第一個錯誤,ExtJS的動態加載檢測到系統當前沒有Person類的定義,於是就自動加載Person.js,這個路徑是不存在的,於是出現了404未找到錯誤。關於動態加載的問題我們接下來會講到。

第二個錯誤,Person 未被定義,所以系統拋出類型錯誤信息。要想解決這個問題,我們需要將Ext.create方法的第一個參數修改為 "MyApp.Person"。但我們在這里不這樣做,因為我們依然希望通過使用Person來完成,那么怎么辦呢?這時就用到別名了。

我們為MyApp.Person 類添加別名:

Ext.define("MyApp.Person", {

  config : {

     Name : '',

     Age : 0

   },

   alias : 'Person',

   Say : function(msg){

     Ext.Msg.alert(this.Name + "  Says : " + msg);

   },

   config : function(config){

       this.initConfig(config);

   }

});

 

很簡單,只要一行代碼,ExtJS 為我們完成了別名的定義。

重新刷新頁面,我們得到了想要的結果:

ExtJS 中的動態加載

它的意思是:如果Ext.loader 可用,且類還沒有被定義,它將試圖通過同步加載來加載類。

接下來我們來試試類動態加載的功能。我們的類MyApp.Person 類的位置是:

我們要告訴ExtJS,我們的MyApp命名空間的路徑,代碼如下:

window.rootUrl = "@Url.Content("~/")";

Ext.Loader.setConfig({

  enabled : true,

  paths : {

    MyApp : rootUrl + "Resources/js/MyApp"

  }

});

我們可以將這段代碼寫在Layout中,因為它在每個頁面中都要用到。

在完成Loader 的配置以后,我們就可以移除掉對Person.js的引用了,然后我們的程序依然能夠正確的運行:

var Tom = Ext.create("MyApp.Person",{

   Name : 'Tom',

   Age : 26

});

Tom.Say("Hello");

注意,我們這里使用的是類的全稱,因為使用別名的時候沒有辦法找到正確的路徑。加載器會通過類名類匹配路徑中的MyApp,然后加載Person.js。

另外,我們還可以手動的加載Person.js,代碼如下:

Ext.require("MyApp.Person");

當手動加載MyApp.Person 類以后,我們就可以繼續使用別名來定義類的對象了:

Var Tom = Ext.create("Person",{

  Name : 'Tom',

 Age : 26

});

Tom.Say("Hello");

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM