我有一个模态弹出窗口,只要编辑器尝试使用某些值保存组件(在这种情况下是过去的日期字段).
在这个弹出窗口中,我向编辑器显示了几个选项(非常类似于默认的"Open Shared Item"对话框)和一个OK/Cancel按钮组合.在取消时我触发"取消"事件,编辑器返回编辑屏幕,这里一切都很好.在"确定"上,我想更改字段的值以匹配编辑器选择的任何内容,然后保存.
我尝试使用FieldBuilder的方法和Boris在其他主题中提到的示例, 但我无法从弹出对话框中找到该字段.
关于如何从模态弹出窗口中修改项目的xml(也可能是页面)的任何建议?
编辑:getControlForFieldName中使用的代码
function getControlForFieldName(name) {
var fieldBuilder = $display.getView().properties.controls.fieldBuilder;
var fieldsContainer = fieldBuilder.properties.input;
var fieldsNode = fieldsContainer.getElement();
var fieldContainer = $dom.getFirstElementChild(fieldsNode);
while (fieldContainer) {
var labelNode = $dom.getFirstElementChild(fieldContainer);
var fieldNode = $dom.getNextElementSibling(labelNode);
var control = fieldNode.control;
if (control.getFieldName() == name) {
return control;
}
fieldContainer = $dom.getNextElementSibling(fieldContainer);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑#2
在Frank的建议之后,以及Jaime&Frank离线的一些帮助,我得到了如下工作:
$evt.addEventHandler(p.dialogPopup, "submit",
this.getDelegate(this._onPopupSubmit));
Run Code Online (Sandbox Code Playgroud)
在我的弹出窗口中,我将所选项(它是关键字ID)传递给事件处理程序:
this.fireEvent("submit", { id: select.options[select.selectedIndex].value });
Run Code Online (Sandbox Code Playgroud)
现在回到事件处理程序中_onPopupSubmit(e)我刚读取e.data.id,加载此关键字,获取ID和Title等属性,并使用item.setMetadata("具有更新值的新元数据")更新项目的元数据.
简单:)
您的代码在弹出窗口中运行,因此您对全局变量所做的任何引用都将从弹出窗口中获取。
所以当你得到 fieldBuilder 时:
var fieldBuilder = $display.getView().properties.controls.fieldBuilder;
Run Code Online (Sandbox Code Playgroud)
$display 是对全局变量的引用。因此,这实际上是在弹出窗口(没有)中查找 FieldBuilder。
要获取Component窗口的FieldBuilder,可以从opener中获取:
var fieldBuilder = opener.$display.getView().properties.controls.fieldBuilder;
Run Code Online (Sandbox Code Playgroud)
不过,您可能需要考虑实际将更新后的值传递给回调函数或(自定义)事件,因为这会使您的弹出窗口更少依赖于opener.技巧。