`
44424742
  • 浏览: 235494 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Ext的面向对象设计(如何建立一个继承Ext控件的"类")

阅读更多
声明:这个并不是所谓发明创举,Ext 2.0 的example中的示例都基于这样的设计。在此,我列出一两种融入了我目前所使用的.net框架的实现。

   优点:这样的设计得到的是一个个包含各种特性的对象,也就是说,只要页面引入相应的js文件,我们便可以直接获取到这个对象。比如,我设计了一个弹出窗 口,它包含了某张表完整的增删改差的功能,那么我可以在任何需要用到它的地方产生这个窗口,而无须写另外的实现,仅需要一行代码(类似于c#.net的用 户控件了)。

  首先,先列出一个关于store的定义吧:

KeStore.js

KeStore = function(data){
  KeStore.superclass.constructor.call(this, {
   remoteSort: true,
   data: data,
    reader: new Ext.data.JsonReader
   ({}, [
    {name: 'MId', type: 'int'},
    {name: 'KId'},
    {name: 'KName'},
    {name: 'IndexDirectory'}
   ])
  });
}

Ext.extend(KeStore, Ext.data.Store);

   当我们页面引入KeStore.js后,就可以直接在js里面产生相应的对象了,var ks = new KeStore(data);,这里的data为你所获得的数据。可能很多人会关心如何更新它数据的问题,使用ks.loadData(data);方法 可以更新它的数据。那么,现在的问题在于如何获取data(符合定义的Json数据)的问题了:这个在前面json json-rpc 如何在项目中便宜引入Ajax框架 (Joyrock开源项目) 这篇文章中,介绍了怎么利用Joyrock开源项目的动态链接库文件,远程调用后台业务逻辑,并得到数据的过程。

  还有另一种方式更新ks的数据,而无须用到Joyrock项目的东东:

TopicStore = function(tid){
 TopicStore.superclass.constructor.call(this, {
  remoteSort: true,
  proxy:new Ext.data.HttpProxy({url:'http://localhost:2433/KDG/PersonplatManager/JsonData/PersonplatData.aspx?typeId=' + tid}),
  reader: new Ext.data.JsonReader({
   totalProperty : 'totalCount',
   root : 'root',
    id : 'KdgPointId'
  },[
  {name: 'KdgPointId'},
  {name: 'KdgTitle'},
  {name: 'KdgKeyWord'},
  {name: 'KdgLabel'},
  {name: 'Remark'},
  {name: 'IsAvailible', type: 'int'},
  {name: 'StatusId', type: 'int'}
  ])
 });

 this.setDefaultSort('KdgPointId', 'desc');
};

Ext.extend(TopicStore, Ext.data.Store, {
 loadData : function(typeId){
   this.proxy = new Ext.data.HttpProxy({ url:'http://localhost:2433/KDG/PersonplatManager/JsonData/PersonplatData.aspx?typeId=' + typeId});
  this.load();
 },
 loadQuery : function(typeId, kdg_kd, kdg_tt, kdg_con){
  var url = 'http://localhost:2433/KDG/PersonplatManager/JsonData/PersonplatData.aspx?typeId=' + typeId;

  if(kdg_kd != "")
   url += '&KdgKeyWord=' + kdg_kd;
  if(kdg_tt != "")
   url += '&KdgTitle=' + kdg_tt;
   if(kdg_con != "")
   url += '&KdgContent=' + kdg_con;

  this.proxy = new Ext.data.HttpProxy({ url: url});
  this.load();
 }
});
  在新建TopicStore对象时候,就需要传入一个参数,TopicStore ts = new TopicStore(3);,更新数据,写了两个方法,loadData()与loadQuery()。在需要更新时候,调用这两个方法,并对应地传递参数即可。

  如此我们可以定义这样一个可编辑的下拉列表了:

KtindexEditGrid.js

KtindexEditGrid = function(){

  // 列模型的定义
  var fm = Ext.form;
  var cm = new Ext.grid.ColumnModel([
   new Ext.grid.RowNumberer(),{
    id:'MId',
   align: 'right',
   header: "关联序号", // 表头
   dataIndex: 'MId', // 表数据字段
   width: 80,
   editor: new fm.TextField({
    allowBlank: false, // 是否允许为空
    disabled : true // 是否允许更改,true意味着你无法修改当前单元格的值
   })
   },{
    header: "知识类序号",
    dataIndex: 'KId',
    width: 80,
    editor: new fm.TextField({
    allowBlank: false,
    disabled : true
   })
    },{
    header: "知识类名称",
    dataIndex: 'KName',
    width: 130,
    editor: new fm.TextField({
    allowBlank: false,
    disabled : true
   })
   },{
    header: "索引目录",
    dataIndex: 'IndexDirectory',
    width: 160,
     editor: new fm.TextField({
    allowBlank: false
    })
  }
 ]);

  // 底部Toolbar上的元素
   var kdgTypeIdHide = new fm.Hidden({id:'kdgTypeId'}); // 隐藏域
   var kdgTypeName = new fm.TextField({ disabled:true,width:120,id:'kdgTypeName' });
   var indexDir = new fm.TextField({ width:150,id:'indexDir'});

  // json-rpc 获取数据
  // KdgPoints是一个.ashx(一般程序文件),它调用后台业务逻辑,得到DataTable,
  // 经过处理后返回符合json格式的数据
   var kdgPointAshx = new KdgPoints();
   var obData = kdgPointAshx.Get_KdgType_IndexDir_Mapping('');

  // 这里用到了前面定义的store了
   var store = new KeStore(obData);

  // 基类结构的定义
   KtindexEditGrid.superclass.constructor.call(this, {
   store: store, // 数据源
   region:'center',
   cm: cm, // 列模型
   bbar: [{ // 底部Toolbar,若想改为顶部,使用tbar属性
   text: '知识类名称',
   tooltip: '点击左边树更改文本框数值'
  },kdgTypeName,{
   text: '索引目录',
   tooltip: '索引文件放置目录'
  },indexDir,{
   text: '新增',
   tooltip: '添加关联',
    handler: newRecord
  },{
   text: '保存',
   tooltip: '保存可编辑Grid的修改',
    handler: save
  },kdgTypeIdHide]
 });

 // 上面handler属性会回调相应的函数,这个为了阐述方便,截断了.... 在文章下半部分放上来
});

Ext.extend(KtindexEditGrid, Ext.grid.EditorGridPanel); // 继承定义
  页面包含KtindexEditGrid.js后,便可以新建它的对象了。你可以将它作为items的一部分,添加到Ext布局里面去,同样调用render('grid-example')直接绘制到<div>上。

  剩下的就是回调函数的一些补充了:

/* ---------------------------- 新增事件 ----------------------------- */
  function newRecord()
 {
   if(kdgTypeIdHide.getValue() == '')
  {
    Ext.MessageBox.show({
    title:'提示',
    msg: '知识类不能为空,请单击左边树节点,设置它的值',
    buttons: Ext.Msg.OK
   });
   return;
  }

  if(indexDir.getValue() == '')
  {
   Ext.MessageBox.show({
    title:'提示',
    msg: '索引目录不能为空,请输入',
    buttons: Ext.Msg.OK
   });

   indexDir.focus();
   return;
  }

  Ext.MessageBox.confirm('提示', '确定添加记录?',doNewRecord);
 }

 function doNewRecord(btn)
 {
  if(btn == 'yes')
  {
   var kdgId = kdgTypeIdHide.getValue();
   var dir = indexDir.getValue();

   var jsonData = { 'KId':kdgId, 'IndexDirectory':dir }

   // json-rpc
   var kdgPointAshx = new KdgPoints();
   var flag = kdgPointAshx.Insert_KdgType_IndexDir_Mapping(jsonData);

    if(flag == true)
    Ext.MessageBox.show({
     title:'提示',
     msg: '保存成功',
      buttons: Ext.Msg.OK
    });
    else
     Ext.MessageBox.show({
      title:'提示',
      msg: '保存失败',
      buttons: Ext.Msg.OK
     });

    var data = kdgPointAshx.Get_KdgType_IndexDir_Mapping(kdgId);
    store.loadData(data);
  }
 }
分享到:
评论

相关推荐

    EXT 自定义控件扩展

    1. **类继承**:EXT支持基于面向对象的编程,自定义控件通常通过继承EXT现有的基础控件类来实现。例如,如果你想要创建一个自定义的按钮,你可以从`Ext.button.Button`类开始,然后添加你自己的方法和属性。 2. **...

    ext继承重写

    EXT JS采用面向对象的编程方式,允许开发者通过继承机制来扩展类的功能,同时通过重写方法来定制或优化原有功能。 EXT JS中的“extend”关键字是实现继承的关键。当你创建一个新的类并声明它`extend`另一个类时,新...

    ext-base.js

    2. **类系统**:EXT使用面向对象的编程方式,"ext-base.js"中包含了类的创建、继承和实例化等机制,使得开发者可以方便地创建自定义组件。 3. **事件系统**:EXT的事件模型是其交互性的重要组成部分,"ext-base.js...

    Ext2.2 中文手册

    - **版本历史**:Ext2.2 是 Ext 的一个早期版本,相对于后续版本来说,它的功能可能较为有限,但在当时是非常先进的。 - **下载与安装**: - 下载地址:http://extjs.com/downloads - 安装方式:下载解压后,可以...

    ExtJS的extend(Ext Designer的使用)

    ExtJS的`extend`特性是其核心的面向对象机制之一,它允许我们在JavaScript中创建类的继承链。在Ext Designer的环境下,这个概念尤为重要,因为设计师工具提供了可视化的界面来帮助开发者更直观地构建和扩展组件。这...

    EXT开发文档

    - **EXT** 支持面向对象编程,可以通过继承机制来扩展现有的组件或创建新的组件。 - 继承使得代码更加模块化,易于维护。 13. **补充资料**: - **EXT** 官方文档提供了丰富的资源,包括教程、API 文档等,可以...

    ext教程

    - **面向对象编程 (OOP)**: ext 的设计思想基于面向对象编程,这使得开发者可以更轻松地组织代码结构,并利用封装、继承和多态等特性来提高代码复用性和维护性。 - **扩展性**: ext 具有良好的扩展性,开发者可以...

    doc格式 ext EXT 中文手册

    - **继承**: Ext支持面向对象的编程模式,包括类的继承和封装。 - **示例**: - 使用构造函数创建对象。 - 共享方法的实现。 以上知识点总结了EXT中文手册中的核心内容,覆盖了从安装到具体使用的各个方面,帮助...

    Ext帮助文档很详细的资源信息

    #### 类设计 面向对象设计是现代软件工程的基础。Ext采用了类和对象的概念,通过构造器函数、方法共享等机制,实现了代码的复用和封装。 #### 表单组件入门 表单组件是Web应用中用于收集用户输入的必备组件。Ext...

    EXT详解.pdf 好资料

    - **面向对象编程** 是EXT的基础之一,通过类来组织代码。 - **对象创建**: 使用`new`关键字来实例化类。 - **构造器函数**: 定义类的构造器来初始化对象的状态。 - **方法共享**: 可以将公用的方法定义在原型链...

    Ext JS in Action.pdf

    - **面向对象的代码开发**:介绍了如何使用Ext JS编写面向对象的代码,包括类的定义、继承等。 - **复合组件的构建**:探讨了如何组合多个简单组件创建复杂功能的复合组件。 - **高级UI技术的应用**:讨论了如何利用...

    ext一份有用的学习文档

    - **ExtJS OOP**:ExtJS提供了一套完整的面向对象编程模型,支持继承、多态等特性。例如: ```javascript Ext.define('MyApp.MyClass', { extend: 'MyApp.BaseClass', constructor: function(config) { this....

    Build Ajax Applications with Ext JS.pdf

    Ext JS最初是由Jack Slocum发起的一个项目,目的是为了扩展Yahoo! User Interface (YUI) Library的功能。随着版本2.0的发布,Ext JS已经成为市场上最简单且功能强大的JavaScript库之一。 ##### 关键特性: 1. **跨...

    ext入门学习文档

    ExtJS是一个功能强大的JavaScript框架,专门设计用于在客户端构建丰富的Web应用程序界面。它不仅支持开发RIA(Rich Internet Applications,即富互联网应用程序),还提供了高度交互性的用户体验。最初,ExtJS基于...

    extjs4.2选择两个月的日期控件

    1. **组件继承**:EXTJS支持面向对象编程,可以通过`Ext.extend`方法创建新的组件类,继承自基础组件,如`Ext.picker.Date`。 2. **扩展方法**:可能添加了新的方法来处理月份选择逻辑,比如`selectTwoMonths`,...

    Ext中文教程.最好的Ext学习资料

    - **配置选项**:配置是Extjs中一个重要的概念,它用于设置组件的属性和行为。 - **Ext.apply()与Ext.applyIf()**:这两个函数用于合并对象,是处理配置选项时常用的工具。 #### 四、消息框组件详解 - **消息框类型...

    EXT 中文手册

    - **对象创建**:EXT支持面向对象的编程方式,可以定义类来封装功能。 - **构造器函数**:使用构造器函数初始化对象的状态。 - **方法共享**:通过原型链的方式可以让多个实例共享同一个方法,提高性能。 #### 十八...

Global site tag (gtag.js) - Google Analytics