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]
    });
 
});

第一个问题,修改如下:

[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()});即可.

先帮你格式化下. 楼主最好上几个截图

[code="java"]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]
});

});[/code]