在 magnolia 的页面详细信息视图中检测 iframe 的变化
Detect a change of iframe in page detail view in magnolia
当用户在页面详细信息应用程序中选择 link 并且只有 iframe 发生变化时,是否有一种方法可以检测正在呈现哪个节点?如果只是 iframe 发生变化,我需要一种可以调用父页面并发送在 iframe 中呈现的节点路径的机制。我们 运行 Magnolia EE 5.6.11。
我的问题是我在 ComboBox 中有一个 ValueChangeListener,我在页面详细信息应用程序的 PageBar 扩展中用作 versionSelector。
// Create a selection component;
private ComboBox versionSelector = new ComboBox();
private Listener listener;
private boolean isSettingValue;
public VersionSelectorViewImpl(){
construct();
}
private void construct() {
versionSelector.setVisible(false);
versionSelector.setSizeUndefined();
versionSelector.setImmediate(true);
versionSelector.setNullSelectionAllowed(false);
versionSelector.setTextInputAllowed(false);
//setup listener for the selected item
versionSelector.addValueChangeListener(new Property.ValueChangeListener() {
@Override
public void valueChange(Property.ValueChangeEvent event) {
if (listener != null) {
listener.versionSelected((Object) event.getProperty().getValue());
}
}
});
}
该实现类似于 LanguageSelector 或 VariantSelector。当有人在页面模板中激活 hyperlink 时,iframe 发生变化并且 valueChange 方法检索到错误的值(即事件来自上一页)。
当有人激活 link 时,PagesEditorSubApp#updateNodePath 调用 updateLocationDependentComponents,后者调用 PageBar.onLocationUpdate。这在我们的例子中调用了 VersionSelector#setCurrentVersion 方法。此时我需要重新加载页面详细信息子应用程序,以便将侦听器正确设置为新页面。我尝试在 setCurrentVersion 方法中使用 pageEditorPresenter.refresh() 方法,但没有成功。
在 Magnolia 5.x 中,您需要触发 ContentChangeEvent
来触发刷新(并希望您要刷新的子应用会监听它,如果是页面详细信息子应用,则不应是问题)。
或者,既然你提到了 LanguageSelector
,你确实可以尝试像从 info.magnolia.pages.app.editor.pagebar.languageselector.LanguageSelector#languageSelected
那样直接调用 PageEditorPresenter
,除非你需要在演示者中修改某些东西(例如示例中的语言环境)上面),这似乎是不必要的代码耦合。
将代码迁移到 Magnolia 6.x 和新的 UI 框架后,您可以更方便地触发数据源更改通知,所有使用来自给定源的数据的视图都会侦听和以这种方式促进刷新(如 PasteComponentAction
here.
中所示
当用户在页面详细信息应用程序中选择 link 并且只有 iframe 发生变化时,是否有一种方法可以检测正在呈现哪个节点?如果只是 iframe 发生变化,我需要一种可以调用父页面并发送在 iframe 中呈现的节点路径的机制。我们 运行 Magnolia EE 5.6.11。 我的问题是我在 ComboBox 中有一个 ValueChangeListener,我在页面详细信息应用程序的 PageBar 扩展中用作 versionSelector。
// Create a selection component;
private ComboBox versionSelector = new ComboBox();
private Listener listener;
private boolean isSettingValue;
public VersionSelectorViewImpl(){
construct();
}
private void construct() {
versionSelector.setVisible(false);
versionSelector.setSizeUndefined();
versionSelector.setImmediate(true);
versionSelector.setNullSelectionAllowed(false);
versionSelector.setTextInputAllowed(false);
//setup listener for the selected item
versionSelector.addValueChangeListener(new Property.ValueChangeListener() {
@Override
public void valueChange(Property.ValueChangeEvent event) {
if (listener != null) {
listener.versionSelected((Object) event.getProperty().getValue());
}
}
});
}
该实现类似于 LanguageSelector 或 VariantSelector。当有人在页面模板中激活 hyperlink 时,iframe 发生变化并且 valueChange 方法检索到错误的值(即事件来自上一页)。
当有人激活 link 时,PagesEditorSubApp#updateNodePath 调用 updateLocationDependentComponents,后者调用 PageBar.onLocationUpdate。这在我们的例子中调用了 VersionSelector#setCurrentVersion 方法。此时我需要重新加载页面详细信息子应用程序,以便将侦听器正确设置为新页面。我尝试在 setCurrentVersion 方法中使用 pageEditorPresenter.refresh() 方法,但没有成功。
在 Magnolia 5.x 中,您需要触发 ContentChangeEvent
来触发刷新(并希望您要刷新的子应用会监听它,如果是页面详细信息子应用,则不应是问题)。
或者,既然你提到了 LanguageSelector
,你确实可以尝试像从 info.magnolia.pages.app.editor.pagebar.languageselector.LanguageSelector#languageSelected
那样直接调用 PageEditorPresenter
,除非你需要在演示者中修改某些东西(例如示例中的语言环境)上面),这似乎是不必要的代码耦合。
将代码迁移到 Magnolia 6.x 和新的 UI 框架后,您可以更方便地触发数据源更改通知,所有使用来自给定源的数据的视图都会侦听和以这种方式促进刷新(如 PasteComponentAction
here.