【发布时间】:2013-09-30 23:51:20
【问题描述】:
我想将一些 Ext 组件渲染到 XTemplate 的输出中。我们希望能够灵活地使用XTemplate 来呈现 HTML,但保留使用 Ext 组件而不是普通的旧 HTML 元素的样式、行为和处理程序。
我目前正在使用Ext.Button 成功完成此操作。在模板中,我正在编写一个占位符 div,如下所示:<div id="paceholder-1"></div>
在模板上调用apply() 之后,我创建一个新的 Ext 组件并像这样渲染它:
this._replacePlaceholders.defer(1, this, [html, 'placeholder-1', collection]);
_replacePlaceholders 函数如下所示:
_replacePlaceholders: function(html, id, collection) {
var emailField = new Ext.form.TextField({
emptyText: 'Email address',
hideLabel: true
});
var downloadButton = new Ext.Button({
text: 'Download as...',
icon: 'images/down.png',
scope: this,
menu: this._createDownloadOptionsMenu(collection) // Create Menu for this Button (works fine)
});
var form = new Ext.form.FormPanel({
items: [emailField, downloadButton]
});
downloadButton.render(html, id);
}
这可以正常工作并将按钮正确呈现到 html 中。按钮菜单的行为符合预期。
但如果我将replacePlaceholders 的最后一行更改为emailField.render(html, id); 或form.render(html, id);,我会收到一个javascript 错误。
TypeError: ct is null
ct.dom.insertBefore(this.el.dom, position);
ext-all-debug.js (line 10978)
我有点困惑,因为从docs 可以看出,调用的render() 方法将是同一个(来自Ext.Component)。但是我玩了一些游戏,似乎无法追踪这里发生了什么。
那么这些组件的行为与Ext.Button 不同,有什么好的理由吗?是否可以渲染Ext.form.TextField 或Ext.form.FormPanel 或任何东西,让我在mt XTemplate html 中使用Ext 文本字段?
注意。我正在使用 ExtJS 3.3.1 并且没有机会升级版本。我相信 ExtJS 4 的功能会让我做的事情变得更容易。
谢谢!
【问题讨论】: