Ext 3 教程代码与 Ext 4 不兼容
我想将本教程从 Ext3 重写到 Ext4。但从我能够观察到的情况来看,createDelegate 函数被删除了(可能与许多其他事情一样)并且它不起作用。我尝试调用 call/apply 而不是这个未定义的 createDelegate 但后来我在代码中遇到了其他问题 - this.msgEl 未定义。如何解决这个问题?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Panel</title>
<link rel="stylesheet" type="text/css" href="resources/css/ext-all.css" />
<script type="text/javascript" src="bootstrap.js"></script>
<script type="text/javascript" src="ext-all.js"></script>
<script type="text/javascript" src="shared/examples.js"></script>
<style type="text/css">
body {
padding: 10px;
}
.x-popup-el {
position: absolute;
background: transparent url(resources/images/default/qtip/tip-sprite.gif) no-repeat right 0;
border-left:1px solid #99BBE8;
padding-right:6px;
overflow:hidden;
zoom:1;
}
.x-popup-body {
background: transparent url(resources/images/default/qtip/tip-sprite.gif) no-repeat 0 -62px;
padding-top:3px;
overflow:hidden;
zoom:1;
}
.x-popup-message-text {
padding:0 20px 0 10px;
font-family:helvetica,tahoma,verdana,sans-serif;
}
.x-popup-message-text.error {
color: red;
}
</style>
<script type="text/javascript">
Ext.ux.PopupMessage = Ext.extend(Object, {
init: function(c) {
this.client = c;
c.showMessage = this.showMessage.apply(this);
if (c.rendered) {
this.onRender(c);
} else {
c.on('render', this.onRender, this);
}
},
onRender: function(c) {
this.el = c.el.createChild(
'<div class="x-hidden x-popup-el">' +
'<div class="x-popup-body">' +
'<span class="x-popup-message-text"></span>' +
'</div>' +
'</div>'
);
this.el.syncFx();
this.msgEl = this.el.child('span.x-popup-message-text');
},
showMessage: function(m, cls) {
if (this.fading) {
clearTimeout(this.fading);
this.fading = 0;
}
console.log(this);
this.msgEl.dom.innerHTML = m;
if (cls) {
this.msgEl.extraCls = cls;
this.msgEl.addClass(cls);
}
this.el.stopFx();
this.el.alignTo(this.client.el, "bl-bl", [0, -1]);
this.el.slideIn('b').fadeIn({
callback: this.hide,
scope: this
});
},
hide: function() {
this.fading = this.el.fadeOut.defer(5000, this.el, [{
callback: function() {
this.msgEl.removeClass(this.msgEl.extraCls);
},
scope: this
}]);
}
});
Ext.onReady(function(){
p = new Ext.Panel({
plugins: new Ext.ux.PopupMessage(),
frame: true,
title: 'My Panel',
renderTo: document.body,
width: 400,
html: Ext.example.bogusMarkup
});
new Ext.Toolbar({
renderTo: document.body,
style: {
'margin-top': '20px'
},
width: 400,
items: [{
text: 'Show message',
handler: function() {
p.showMessage("Hello world!");
}
}, {
text: 'Show error message',
handler: function() {
p.showMessage("Something bad!", "error");
}
}]
});
});
</script>
</head>
<body>
</body>
</html>
错误:
this.msgEl is undefined
file:///C:/Work/learn-tmp/Popup.html
Line 76
I wanted to rewrite this tutorial to Ext4, from Ext3. But from what I was able to observee, the createDelegate function was removed (as with many other things propably) and it does not work. I've tried calling call/apply instead of this undefined createDelegate but then I'm encountering other problem later in the code - this.msgEl is undefined. How to get around this ?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Panel</title>
<link rel="stylesheet" type="text/css" href="resources/css/ext-all.css" />
<script type="text/javascript" src="bootstrap.js"></script>
<script type="text/javascript" src="ext-all.js"></script>
<script type="text/javascript" src="shared/examples.js"></script>
<style type="text/css">
body {
padding: 10px;
}
.x-popup-el {
position: absolute;
background: transparent url(resources/images/default/qtip/tip-sprite.gif) no-repeat right 0;
border-left:1px solid #99BBE8;
padding-right:6px;
overflow:hidden;
zoom:1;
}
.x-popup-body {
background: transparent url(resources/images/default/qtip/tip-sprite.gif) no-repeat 0 -62px;
padding-top:3px;
overflow:hidden;
zoom:1;
}
.x-popup-message-text {
padding:0 20px 0 10px;
font-family:helvetica,tahoma,verdana,sans-serif;
}
.x-popup-message-text.error {
color: red;
}
</style>
<script type="text/javascript">
Ext.ux.PopupMessage = Ext.extend(Object, {
init: function(c) {
this.client = c;
c.showMessage = this.showMessage.apply(this);
if (c.rendered) {
this.onRender(c);
} else {
c.on('render', this.onRender, this);
}
},
onRender: function(c) {
this.el = c.el.createChild(
'<div class="x-hidden x-popup-el">' +
'<div class="x-popup-body">' +
'<span class="x-popup-message-text"></span>' +
'</div>' +
'</div>'
);
this.el.syncFx();
this.msgEl = this.el.child('span.x-popup-message-text');
},
showMessage: function(m, cls) {
if (this.fading) {
clearTimeout(this.fading);
this.fading = 0;
}
console.log(this);
this.msgEl.dom.innerHTML = m;
if (cls) {
this.msgEl.extraCls = cls;
this.msgEl.addClass(cls);
}
this.el.stopFx();
this.el.alignTo(this.client.el, "bl-bl", [0, -1]);
this.el.slideIn('b').fadeIn({
callback: this.hide,
scope: this
});
},
hide: function() {
this.fading = this.el.fadeOut.defer(5000, this.el, [{
callback: function() {
this.msgEl.removeClass(this.msgEl.extraCls);
},
scope: this
}]);
}
});
Ext.onReady(function(){
p = new Ext.Panel({
plugins: new Ext.ux.PopupMessage(),
frame: true,
title: 'My Panel',
renderTo: document.body,
width: 400,
html: Ext.example.bogusMarkup
});
new Ext.Toolbar({
renderTo: document.body,
style: {
'margin-top': '20px'
},
width: 400,
items: [{
text: 'Show message',
handler: function() {
p.showMessage("Hello world!");
}
}, {
text: 'Show error message',
handler: function() {
p.showMessage("Something bad!", "error");
}
}]
});
});
</script>
</head>
<body>
</body>
</html>
The error :
this.msgEl is undefined
file:///C:/Work/learn-tmp/Popup.html
Line 76
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
createDelegate 现在是一个静态方法——所有原生 JS 对象原型覆盖都已在 Ext 4 中删除。因此,您可以执行
Ext.Function.createDelegate(myFn) 来代替
或更好的别名myFn.createDelegate(this)
, this)Ext.bind(myFn, this)
。createDelegate is now a static method -- all native JS object prototype overrides have been removed in Ext 4. So instead of
myFn.createDelegate(this)
you would doExt.Function.createDelegate(myFn, this)
or the preferable aliasExt.bind(myFn, this)
.我还没有使用过 Ext4,但可以从使用 ext-all-debug.js 而不是 ext-all.js 开始。您可能会获得有关导致错误的原因的更具体信息。
I haven't used Ext4 yet, but a place to start is to use ext-all-debug.js instead of ext-all.js. You might get more specific information as to what is causing the error.
更改:c.showMessage = this.showMessage.apply(this);
到: c.showMessage = this.showMessage.apply(this, 参数);
这会在“this”范围内调用 showMessage 函数,并使用参数“数组”,其中包含调用该函数所用的参数。
change : c.showMessage = this.showMessage.apply(this);
to : c.showMessage = this.showMessage.apply(this, arguments);
This calls the showMessage function in the scope of 'this' and uses the arguments "array" which contains the arguments the the function has been called with.