每当编辑器尝试使用某些值保存组件时,我都会出现一个模态弹出窗口(在这种情况下是过去的日期字段)。
在这个弹出窗口中,我向编辑器显示了几个选项(非常类似于默认的“Open Shared Item”对话框)和一个OK / Cancel按钮组合。在取消时我触发“取消”事件,编辑器返回编辑屏幕,这里一切都很好。在“确定”上,我想更改字段的值以匹配编辑器选择的任何内容,然后保存。
我尝试使用FieldBuilder的方法和this other topic上提到的样本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);
}
}
编辑#2
在Frank的建议之后,以及Jaime& amp;弗兰克离线,我按照以下方式开始工作:
$evt.addEventHandler(p.dialogPopup, "submit",
this.getDelegate(this._onPopupSubmit));
在我的弹出窗口中,我将所选项目(它是关键字ID)传递给事件处理程序:
this.fireEvent("submit", { id: select.options[select.selectedIndex].value });
现在回到事件处理程序_onPopupSubmit(e)
我刚刚阅读了e.data.id,加载了这个关键字,得到ID&等属性。标题,并使用item.setMetadata(“具有更新值的新元数据”)更新项目的元数据。
简单:)
答案 0 :(得分:4)
您的代码在弹出窗口中运行,因此您对全局变量所做的任何引用都将从弹出窗口中获取。
所以当你得到fieldBuilder时:
var fieldBuilder = $display.getView().properties.controls.fieldBuilder;
$ display是对全局变量的引用。所以这实际上是在弹出窗口中查找FieldBuilder(没有一个)。
要获取Component窗口的FieldBuilder,您可以从开场白中获取它:
var fieldBuilder = opener.$display.getView().properties.controls.fieldBuilder;
您可能想要考虑将更新后的值实际传递给回调函数或使用(自定义)事件,因为这会使您的弹出窗口更少依赖于opener.
技巧。