本文整理匯總了TypeScript中@ephox/alloy.AlloyEvents.runOnDetached方法的典型用法代碼示例。如果您正苦於以下問題:TypeScript AlloyEvents.runOnDetached方法的具體用法?TypeScript AlloyEvents.runOnDetached怎麽用?TypeScript AlloyEvents.runOnDetached使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類@ephox/alloy.AlloyEvents
的用法示例。
在下文中一共展示了AlloyEvents.runOnDetached方法的7個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的TypeScript代碼示例。
示例1: withSpec
const initDialog = <T>(getInstanceApi: () => Types.Dialog.DialogInstanceApi<T>, extras: ExtraListeners) => {
const fireApiEvent = <E extends CustomEvent>(eventName: string, f: (api: Types.Dialog.DialogInstanceApi<T>, spec: Types.Dialog.Dialog<T>, e: E, c: AlloyComponent) => void) => {
return AlloyEvents.run<E>(eventName, (c, se) => {
withSpec(c, (spec, _c) => {
f(getInstanceApi(), spec, se.event(), c);
});
});
};
const withSpec = (c: AlloyComponent, f: (spec: Types.Dialog.Dialog<T>, c: AlloyComponent) => void): void => {
Reflecting.getState(c).get().each((currentDialogInit: DialogManager.DialogInit<T>) => {
f(currentDialogInit.internalDialog, c);
});
};
return [
...initCommonEvents(fireApiEvent, extras),
fireApiEvent<FormSubmitEvent>(formSubmitEvent, (api, spec) => spec.onSubmit(api)),
fireApiEvent<FormChangeEvent<T>>(formChangeEvent, (api, spec, event) => {
spec.onChange(api, { name: event.name() });
}),
fireApiEvent<FormActionEvent>(formActionEvent, (api, spec, event) => {
spec.onAction(api, { name: event.name(), value: event.value() });
}),
fireApiEvent<FormTabChangeEvent>(formTabChangeEvent, (api, spec, event) => {
spec.onTabChange(api, event.title());
}),
// When the dialog is being closed, store the current state of the form
AlloyEvents.runOnDetached((component) => {
const api = getInstanceApi();
Representing.setValue(component, api.getData());
})
];
};
示例2:
const wrapInPopDialog = (toolbarSpec: AlloySpec) => {
return {
dom: {
tag: 'div',
classes: ['tox-pop__dialog'],
},
components: [toolbarSpec],
behaviours: Behaviour.derive([
Keying.config({
mode: 'acyclic'
}),
AddEventsBehaviour.config('pop-dialog-wrap-events', [
AlloyEvents.runOnAttached((comp) => {
editor.shortcuts.add('ctrl+F9', 'focus statusbar', () => Keying.focusIn(comp));
}),
AlloyEvents.runOnDetached((comp) => {
editor.shortcuts.remove('ctrl+F9');
})
])
])
};
};
示例3: interpretInForm
AlloyForm.sketch((parts) => {
return {
dom: {
tag: 'div',
classes: [ 'tox-form' ]
},
components: Arr.map(tab.items, (item) => interpretInForm(parts, item, backstage)),
formBehaviours: Behaviour.derive([
Keying.config({
mode: 'acyclic',
useTabstopAt: Fun.not(NavigableObject.isPseudoStop)
}),
AddEventsBehaviour.config('TabView.form.events', [
AlloyEvents.runOnAttached(setDataOnForm),
AlloyEvents.runOnDetached(updateDataWithForm)
]),
Receiving.config({
channels: Objects.wrapAll([
{
key: SendDataToSectionChannel,
value: {
onReceive: updateDataWithForm
}
},
{
key: SendDataToViewChannel,
value: {
onReceive: setDataOnForm
}
}
])
})
])
};
})
示例4: runWithApi
const onControlDetached = <T>(getApi: GetApiType<T>, editorOffCell: Cell<OnDestroy<T>>) => {
return AlloyEvents.runOnDetached((comp) => runWithApi(getApi, comp)(editorOffCell.get()));
};
示例5: function
const makeMenu = function (value, items, memMenuThunk, collapsable) {
return {
value,
dom: {
tag: 'div'
},
components: [
Button.sketch({
dom: {
tag: 'div',
classes: [ Styles.resolve('styles-collapser') ]
},
components: collapsable ? [
{
dom: {
tag: 'span',
classes: [ Styles.resolve('styles-collapse-icon') ]
}
},
GuiFactory.text(value)
] : [ GuiFactory.text(value) ],
action (item) {
if (collapsable) {
const comp = memMenuThunk().get(item);
TieredMenu.collapseMenu(comp);
}
}
}),
{
dom: {
tag: 'div',
classes: [ Styles.resolve('styles-menu-items-container') ]
},
components: [
Menu.parts().items({ })
],
behaviours: Behaviour.derive([
AddEventsBehaviour.config('adhoc-scrollable-menu', [
AlloyEvents.runOnAttached(function (component, simulatedEvent) {
Css.set(component.element(), 'overflow-y', 'auto');
Css.set(component.element(), '-webkit-overflow-scrolling', 'touch');
Scrollable.register(component.element());
}),
AlloyEvents.runOnDetached(function (component) {
Css.remove(component.element(), 'overflow-y');
Css.remove(component.element(), '-webkit-overflow-scrolling');
Scrollable.deregister(component.element());
})
])
])
}
],
items,
menuBehaviours: Behaviour.derive([
Transitioning.config({
initialState: 'after',
routes: Transitioning.createTristate('before', 'current', 'after', {
transition: {
property: 'transform',
transitionClass: 'transitioning'
}
})
})
])
};
};
示例6: getHeader
const renderUrlDialog = (internalDialog: Types.UrlDialog.UrlDialog, extra: WindowExtra<any>, editor: Editor, backstage: UiFactoryBackstage) => {
const header = getHeader(internalDialog.title, backstage);
const body = renderIframeBody(internalDialog);
const footer = internalDialog.buttons.bind((buttons) => {
// Don't render a footer if no buttons are specified
if (buttons.length === 0) {
return Option.none();
} else {
return Option.some(renderModalFooter({ buttons }, backstage.shared.providers));
}
});
const dialogEvents = SilverDialogEvents.initUrlDialog(() => instanceApi, getEventExtras(() => dialog, extra));
// Add the styles for the modal width/height
const styles = {
...internalDialog.height.fold(() => ({}), (height) => ({ 'height': height + 'px', 'max-height': height + 'px' })),
...internalDialog.width.fold(() => ({}), (width) => ({ 'width': width + 'px', 'max-width': width + 'px' })),
};
// Default back to using a large sized dialog, if no dimensions are specified
const classes = internalDialog.width.isNone() && internalDialog.height.isNone() ? [ 'tox-dialog--width-lg' ] : [];
// Determine the iframe urls domain, so we can target that specifically when sending messages
const iframeUri = new URI(internalDialog.url, { base_uri: new URI(window.location.href) });
const iframeDomain = `${iframeUri.protocol}://${iframeUri.host}${iframeUri.port ? ':' + iframeUri.port : ''}`;
const messageHandlerUnbinder = Cell(Option.none());
// Setup the behaviours for dealing with messages between the iframe and current window
const extraBehaviours = [
AddEventsBehaviour.config('messages', [
// When the dialog is opened, bind a window message listener for the spec url
AlloyEvents.runOnAttached(() => {
const unbind = DomEvent.bind(Element.fromDom(window), 'message', (e) => {
// Validate that the request came from the correct domain
if (iframeUri.isSameOrigin(new URI(e.raw().origin))) {
const data = e.raw().data;
// Handle the message if it has the 'mceAction' key, otherwise just ignore it
if (isSupportedMessage(data)) {
handleMessage(editor, instanceApi, data);
} else if (isCustomMessage(data)) {
internalDialog.onMessage(instanceApi, data);
}
}
});
messageHandlerUnbinder.set(Option.some(unbind));
}),
// When the dialog is closed, unbind the window message listener
AlloyEvents.runOnDetached(() => {
messageHandlerUnbinder.get().each((unbinder) => unbinder.unbind());
})
]),
Receiving.config({
channels: {
[bodySendMessageChannel]: {
onReceive: (comp, data) => {
// Send the message to the iframe via postMessage
SelectorFind.descendant(comp.element(), 'iframe').each((iframeEle) => {
const iframeWin = iframeEle.dom().contentWindow;
iframeWin.postMessage(data, iframeDomain);
});
}
}
}
})
];
const spec = {
header,
body,
footer,
extraClasses: classes,
extraBehaviours,
extraStyles: styles
};
const dialog = renderModalDialog(spec, internalDialog, dialogEvents, backstage);
const instanceApi = getUrlDialogApi(dialog);
return {
dialog,
instanceApi
};
};
示例7: onEscape
const renderModalDialog = (spec: DialogSpec, initialData, dialogEvents: AlloyEvents.AlloyEventKeyAndHandler<any>[], backstage: UiFactoryBackstage) => {
const updateState = (_comp, incoming) => {
return Option.some(incoming);
};
return GuiFactory.build(
ModalDialog.sketch({
lazySink: backstage.shared.getSink,
// TODO: Disable while validating
onEscape(c) {
AlloyTriggers.emit(c, formCancelEvent);
return Option.some(true);
},
useTabstopAt: (elem) => {
return !NavigableObject.isPseudoStop(elem) && (
Node.name(elem) !== 'button' || Attr.get(elem, 'disabled') !== 'disabled'
);
},
modalBehaviours: Behaviour.derive([
Reflecting.config({
channel: dialogChannel,
updateState,
initialData
}),
RepresentingConfigs.memory({ }),
Focusing.config({}),
AddEventsBehaviour.config('execute-on-form', dialogEvents.concat([
AlloyEvents.runOnSource(NativeEvents.focusin(), (comp, se) => {
Keying.focusIn(comp);
})
])),
AddEventsBehaviour.config('scroll-lock', [
AlloyEvents.runOnAttached(() => {
Class.add(Body.body(), 'tox-dialog__disable-scroll');
}),
AlloyEvents.runOnDetached(() => {
Class.remove(Body.body(), 'tox-dialog__disable-scroll');
}),
]),
...spec.extraBehaviours
]),
eventOrder: {
[SystemEvents.execute()]: [ 'execute-on-form' ],
[SystemEvents.receive()]: [ 'reflecting', 'receiving' ],
[SystemEvents.attachedToDom()]: [ 'scroll-lock', 'reflecting', 'messages', 'execute-on-form', 'alloy.base.behaviour' ],
[SystemEvents.detachedFromDom()]: [ 'alloy.base.behaviour', 'execute-on-form', 'messages', 'reflecting', 'scroll-lock' ],
},
dom: {
tag: 'div',
classes: [ 'tox-dialog' ].concat(spec.extraClasses),
styles: {
position: 'relative',
...spec.extraStyles
}
},
components: [
spec.header,
spec.body,
...spec.footer.toArray()
],
dragBlockClass: 'tox-dialog-wrap',
parts: {
blocker: {
dom: DomFactory.fromHtml('<div class="tox-dialog-wrap"></div>'),
components: [
{
dom: {
tag: 'div',
classes: [ 'tox-dialog-wrap__backdrop' ]
}
}
]
}
}
})
);
};