在 DOM 准备好后执行 JS 代码的一种方法(使用CycleJS和xstream )是运行(否则)不可操作的 observable。为此,请select
':root'
分配一个不存在的事件,并使用startWith
. 启动流后,运行一个map
执行您的设置功能的程序。要订阅 observable,请将其发送给非操作驱动程序:
function main (sources) {
// Initiate observable, run setup function
const noop$ = sources.DOM.select(':root').events('noop')
.startWith(1).map(noop => runSetup())
...
return {
DOM: vdom$,
noop: noop$
}
}
...
Cycle.run(main, {
DOM: makeDOMDriver('#app'),
// non-operative driver
noop: noop$ => { noop$.addListener(
{next: noop => {}, error: ()=>{}, complete: ()=>{}}
) }
})
Codepen.io 运行设置示例
of
另一种方法是在驱动程序中运行您的设置脚本并使用可观察的触发它。
function main (sources) {
// trigger observable
const setup$ = xs.of(1)
...
return {
DOM: vdom$,
setup: setup$
}
}
Cycle.run(main, {
DOM: makeDOMDriver('#app'),
// setup driver
setup: setup$ => { setup$.addListener({next: setup => {
// setup code goes here
console.log('run setup: ', document.querySelector('#app').children.length)
}, error: ()=>{}, complete: ()=>{}}) }
})
Codepen.io 设置驱动程序示例。
如果在创建 DOM 元素之前需要用户输入:
function main (sources) {
const click$ = sources.DOM.select('div#clickme').events('click')
const vdom$ = click$
.mapTo(div('#newDomElement',"I'm new."))
.startWith(div('#clickme','Click me.'))
return {
DOM: vdom$,
setup: click$
}
}
Cycle.run(main, {
DOM: makeDOMDriver('#app'),
setup: setup$ => { setup$.addListener({next: setup => {
// setup code goes here
initAutoComplDummy()
}, error: ()=>{}, complete: ()=>{}}) }
})
Codepen.io 用户输入后设置驱动程序示例