Tridion 无法使用GUI扩展弹出窗口获取元素错误的唯一id

Tridion 无法使用GUI扩展弹出窗口获取元素错误的唯一id,tridion,tridion-2011,Tridion,Tridion 2011,我正在构建一个GUI扩展,其中包括一个弹出窗口,单击功能区栏中的新按钮即可打开。弹出窗口包括一个下拉列表,其中动态填充了使用核心服务从系统收集的一些信息。至少是这样。我可以让按钮出现,它会打开弹出窗口,但一旦我开始使用弹出窗口的javascript,我就会出现一个错误,无法获取元素的唯一id,CME也没有完成加载。以下是我目前掌握的情况: 弹出ASPX 选择用户 选择用户 弹出ASPX代码 namespace SwitchUser.Popups { [ControlResourcesDepe

我正在构建一个GUI扩展,其中包括一个弹出窗口,单击功能区栏中的新按钮即可打开。弹出窗口包括一个下拉列表,其中动态填充了使用核心服务从系统收集的一些信息。至少是这样。我可以让按钮出现,它会打开弹出窗口,但一旦我开始使用弹出窗口的javascript,我就会出现一个错误
,无法获取元素的唯一id
,CME也没有完成加载。以下是我目前掌握的情况:

弹出ASPX


选择用户
选择用户
弹出ASPX代码

namespace SwitchUser.Popups
{
[ControlResourcesDependence(新[]{typeof(弹出式),
typeof(Tridion.Web.UI.Controls.Button),
类型(堆栈),
类型(下拉列表),
类型(列表)}]
[ControlResources(“SwitchUser.Resources”)]
公共部分类SwitchUserPopup:TridionPage
{
受保护的覆盖无效OnInit(事件参数e)
{
碱基.奥尼特(e);
TridionManager tm=新的TridionManager();
tm.Editor=“SwitchUser”;
System.Web.UI.HtmlControls.HtmlGenericControl dep=
新系统.Web.UI.HtmlControls.HtmlGenericControl(“依赖项”);
dep.InnerText=“Tridion.Web.UI.Editors.CME”;
tm.dependencies.Add(dep);
System.Web.UI.HtmlControls.HtmlGenericControl dep2=
新系统.Web.UI.HtmlControls.HtmlGenericControl(“依赖项”);
dep2.InnerText=“Tridion.Web.UI.Editors.CME.commands”;
tm.dependencies.Add(dep2);
//将它们添加到标题部分
this.Header.Controls.Add(tm);//At(0,tm);
}
}
}
弹出JS

Type.registerNamespace(“SwitchUser.Popups”);
SwitchUser.Popups.SwitchUser=函数(元素){
Type.enableInterface(这是“SwitchUser.Popups.SwitchUser”);
这个.addInterface(“Tridion.Cme.View”);
};
SwitchUser.Popups.SwitchUser.prototype.initialize=函数(){
$log.message(“初始化交换机用户弹出窗口…”);
callBase(“Tridion.Cme.View”,“initialize”);
var p=该属性;
var c=p.对照组;
c、 UserDropdown=$controls.getControl($(“#SwitchUserDropdown”),“Tridion.controls.Dropdown”);
};
$display.registerView(SwitchUser.Popups.SwitchUser);
扩展在
System.config
中配置正确-我可以在javascript控制台中看到日志消息。但是,我还看到以下附加信息导致此
无法获取元素的唯一id
错误:

匿名(对象{..})
WebRequest.completed(对象{..})
Net.loadFile$onComplete(对象{..})
Net.loadFile$onOperationCompleted()
Xml.loadXmlDocuments$onSuccess(数组)
Xml.loadXmlDocument$onSuccess(数组)
Dropdown.setup$filesload(对象{..})
setupDone()
匿名(函数:DisplayController$start())
DisplayController.start()
匿名()
匿名(未定义,“Tridion.Controls.Dropdown”)
Assert$raiseError(“无法获取元素的唯一id。”)

从记录的信息来看,问题似乎在于下拉列表。如果我在JS中注释掉注册视图的行,那么我不会得到错误,但是我也不会得到日志消息,所以我怀疑这是一个强制调用。有人能解释为什么会发生这种情况吗?我一直在使用作为参考,我相信我已经复制了那里的内容

更新

我试图一步一步地浏览代码——我找到了一行合适的代码,并在那里放置了一个断点。然后我重新加载了CME,突然我的断点出现在一行与我的代码无关的代码上,我找不到任何与我的代码相关的东西。但是,根据控制台,它仍在执行中

因此,我将日志消息放在initialize方法中,如下所示:

SwitchUser.Popups.SwitchUser.prototype.initialize=函数(){
$log.message(“初始化交换机用户弹出窗口…”);
callBase(“Tridion.Cme.View”,“initialize”);
$log.message(“Tridion.Cme.View callBase done”);
var p=该属性;
var c=p.对照组;
$log.message(“设置属性和控件”);
c、 UserDropdown=$controls.getControl($(“#SwitchUserDropdown”),“Tridion.controls.Dropdown”);
$log.message(“获取用户下拉控件”);
};

我可以在控制台中看到,它记录了所有设置属性和控件的日志,然后我得到了错误。

我在getControl方法中设置了一个断点,并且能够确定为什么我得到了错误<代码>$(“#SwitchUserDropdown”)没有找到任何内容,因此当下面的代码运行时,它抛出了错误:

varid=Tridion.Utils.Dom.getUniqueID(元素);
如果(id)
{
var-control=实例[id];
如果(!控制)
{
控件=实例[id]=新的ctor(元素、设置);
if(Tridion.Type.isFunction(control.initialize))
{
控件初始化();
}
}
}
其他的
{
Tridion.Utils.Assert.raiseError(“无法获取元素的唯一id”);
}
返回控制;
很明显,现在我知道为什么代码在错误的时间运行了。我认为它不应该在CME加载时运行,而应该在弹出窗口打开时运行。这使我了解了编辑器配置文件中的资源配置。我之前将弹出窗口的JS与功能区工具栏按钮相关的其他资源分组。通过将特定于弹出窗口的资源放置在它们自己的资源组中,我能够停止错误并成功获得控制。

I