sno2wolf 2009-09-04 20:14
浏览 340
已采纳

Extjs this.el.dom为空或不是对象

大家好,这个程序,有两处(?????????的地方)有问题,第一处我是想,动态改变form里textfiled的readOnly属性

第二处我是想,删除用户选择的记录。

 

Ext.onReady(function(){
 
 //当超级管理员点击 "详情" 按钮时,弹出所需要的窗口
 //record 将用户选中的Record对象,放到record中,然后在放到form里
function showWindowForm(text) {
    //直接取得选中的行对应的record  
    var record = grid.getSelectionModel().getSelected();
    if(!record&&(text!="tianJia")){  
     Ext.Msg.alert('信息','请选择要编辑的数据');  
       return;  
    }
       win.show(Ext.get(text));
       if(text!="tianJia")
       form.getForm().loadRecord(record);
   
}

//当点击"添加"、"修改"按钮时,隐藏的form的"确定"按钮显示出来、并同时将"取消"按钮换回来,还要form中的所有textfield元素进入可编辑状态。而当点击"详情"按钮,则反之。
function setFormButton(text) {
    form.items.each(function eachItem(item,index,length){   
                if(item.isXType("textfield")){
                   if(text=="xiangQing")
                      item.readOnly=true;    //有时这个设置有用,可有时他也没用。不过下面的Button的设置,保证了程序的安全性?????????????????????????
                   else
                      item.readOnly=false;
                }
                if (item.items && item.items.getCount() > 0) {  
                     item.items.each(eachItem, this);  
                }
    },this);
    
    if(text=="xiangQing")
     win.buttons[0].hide();
    else
     win.buttons[0].show();
     
    if(text=="xiangQing")
     win.buttons[1].setText("确定");
    else
     win.buttons[1].setText("取消");
}

 
 //定义store读取数据的格式
 var DepartmentRecord = new Ext.data.Record.create([
  {name: 'id',type: 'int'},
  {name: 'name',type: 'string'},
  {name: 'description',type: 'string'}
 ]);
 //定义行选择模式
 var sm = new Ext.grid.CheckboxSelectionModel();
 //定义grid的列模式
    var cm = new Ext.grid.ColumnModel([
        sm,
        {header:'名称',dataIndex:'name'},
        {header:'描述',dataIndex:'description'}
    ]);

    var store = new Ext.data.Store({
        proxy: new Ext.data.HttpProxy({url:'../servlet/DepartmentType_list'}),
        reader: new Ext.data.JsonReader({
            totalProperty: 'totalCount',
            root: 'result'
        }, DepartmentRecord)
    });
    //grid 设置 start
    var grid = new Ext.grid.GridPanel({
        region: 'center',
        title: "系部类型列表",
        autoHeight: true,
        store: store,
        cm: cm,
        sm: sm,
        loadMask: {
         msg: "正在载入,请稍等。。。。。"
        },
        viewConfig: {
         forceFit: true  //表格会自动延展每列的长度,使内容填满整个表格
        },
        tbar: new Ext.Toolbar(
        ['-',{
           text: '详情',//当超级管理员点击某一行,再点击此按钮,弹出"详情"窗口
           id: 'xiangQing',
           handler: function(){ showWindowForm("xiangQing");setFormButton("xiangQing") } 
        },'-',{
           text: '添加',
           id: 'tianJia',
           handler: function() { showWindowForm("tianJia");setFormButton("tianJia") }  
        },'-',{
           text: '修改',
           id: 'xiuGai',
           handler: function() { showWindowForm("xiuGai");setFormButton("xiuGai") } 
        },'-',{
           text: '删除',
           handler: function() {
             var record2 = grid.getSelectionModel().getSelected();
             if(!record2) {                                                                    
              Ext.Msg.alert("信息","请选择您要删除的信息。");                                        
             }                                                                                      
             else {
              form.getForm().loadRecord(record2);
              Ext.Msg.confirm('确认对话框','你确定要删除这行信息吗?',function(btn) {            //难道仅仅是因为 form 在 win 里,而不在 grid 里
                  if(btn=='yes') {                                                                                       
                     form.getForm().submit({                                                                     //就出现 form.getForm().findField("id") 为空或不是对象
                  url: '../servlet/DepartmentType_delete',                                             //等问题吗。???????????????????????????
                  success: function(f,action) {
                   if(action.result.success) {
                    Ext.Msg.alert("信息",action.result.msg,function() {
                      grid.getStore().reload();
                      form.getForm().reset();//清空form上一次提交的数据
                    })
                   }
                  },
                  failure: function() {
                   Ext.Msg.alert("信息","操作失败");
                  }
             })
                  }
              });  
             }
           }   
        },'-']),
        bbar: new Ext.PagingToolbar({   //分页工具栏 start
            pageSize: 10,
            store: store,
            displayInfo: true,//显示数据信息
            displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条',
            emptyMsg: "没有记录"         //分页工具栏 end
        })
    });
    // grid 设置 end
   
     store.load({params:{start:0,limit:15}});

    // form 设置 start
     var form = new Ext.form.FormPanel({
        labelAlign: 'right',
        labelWidth: 40,
        frame: true,
        defaults: {
             anchor: "90%",
             allowBlank: false
        },
        height: 280,
        width: 200,
        defaultType: 'textfield',
        items: [{
           xtype: 'hidden',
           name: 'id'
        },{
          fieldLabel: '名称',
          id: 'name',
          name: 'name'
        },{
          fieldLabel: '描述',
          name: 'description',
          xtype: 'textarea',
          height:180,
          maxLength: 127
        }]
    });
       //form 设置 end
   
        //定义所需窗口 window  Start // window 设置 start 此窗口用于存放form
      var win = new Ext.Window({
        title: '浏览系部类型',
        layout: 'fit',
        width: 350,
        height: 300,
        closable: false, //隐藏关闭按钮
        modal: true,
        plain: true,
        buttonAlign: 'center',
        items:[form],
        buttons: [{
           text: '确定',
           handler: function() {
            if(!form.getForm().isValid()) {
             return;
            }
            var id = form.getForm().findField('id').getValue();
            if(id=='') {
               form.getForm().submit({
               url: '../servlet/DepartmentType_add',
               success: function(f,action) {
              if(action.result.success) {
              Ext.Msg.alert("信息",action.result.msg,function() {
                 grid.getStore().reload();
                 form.getForm().reset();
                 win.hide();
               });
              }
                },
                failure: function() {
                Ext.Msg.alert("信息","添加失败");
                }
                });
            }
            else {
               form.getForm().submit({
                 url: '../servlet/DepartmentType_fix',
                 success: function(f,action) {
                  if(action.result.success) {
                   Ext.Msg.alert("信息",action.result.msg,function() {
                      grid.getStore().reload();
                      form.getForm().reset();//清空form上一次提交的数据
                      win.hide();
                   });
                  }
                 },
                 failure: function() {
                  Ext.Msg.alert("信息","修改失败");
                 }
               }) 
            }
          //  win.hide();
           }
        },{
           text: '取消',
           handler: function() {
            form.getForm().reset();
            win.hide();
           }
        }]
    }); 
    //   //定义所需窗体 window 设置 end 
   

    var _viewport = new Ext.Viewport({
      layout: 'border',
      items: [grid]
    });
 
});

  • 写回答

2条回答 默认 最新

  • iteye_10013 2009-09-04 23:48
    关注

    第一个问题,修改如下:

    [code="javascript"]
    function setFormButton(text) {
    var editable = (text == "xiangQing");
    //设置TextField是否readonly, 之前你用的是form,不是form.getForm
    form.getForm().items.eachKey(function (key, item) {
    if (item.isXType("textfield")) {
    //一句禁用,一句不可编辑,自己选
    item.setDisabled(editable);
    item.el.dom.readOnly = editable;
    }
    });

    if (text == "xiangQing") win.buttons[0].hide();
    else win.buttons[0].show();

    if (text == "xiangQing") win.buttons[1].setText("确定");
    else win.buttons[1].setText("取消");
    }
    [/code]

    第2个问题之所以报el不存在,是因为这时候你的window还没被渲染,form也自然不会被渲染,所以找不到.如果你弹出过一次窗口,再提交就不会报这个错了
    在win的定义后面加一句:
    win.show(null,function(){win.hide()});即可.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能