DOM加载到cycle.js后如何执行javascript

How to execute javascript after DOM is loaded in cycle.js

DOM加载到cycle.js后如何执行javascript?我不能把它放在我的 main() 中,因为那时 DOM 还没有加载。对于上下文,我基本上是在尝试初始化一个花哨的自动完成功能,它需要目标 DOM 元素存在,如果我的方法有误,请随时指点。

我试过这个:

sources.DOM.select(':root')
  .observable.take(1)
  .subscribe((element) => initAutoCompl())

...但是 select 正在返回 null,我也尝试针对其他元素进行选择。

在 DOM 准备好后执行一次 JS 代码的一种方法(使用 CycleJS with xstream)是 运行 一个(否则)non-operative observable。为此 select ':root' 然后分配一个 non-existent 事件,并使用 startWith 启动流。流启动后 运行 一个 map 将执行您的设置功能。要订阅 observable,请将其发送给 non-operative 驱动程序:

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 Run Setup example


另一种方法是 运行 驱动程序中的设置脚本并使用 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 Setup Driver example.


如果在创建 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 Setup Driver After User Input example

我实际上问错了我的问题,因为当我实施我的解决方案时,我意识到自动完成不在第一页上,所以 bloodyKnuckles 解决方案虽然正确回答了问题,但没有解决我的问题。

下面是如何在 cycle.js

中的 DOM 上呈现任意项目后 运行 javascript

在你的主

里面
 const elementId$ = sources.DOM.elements().filter(c => (document.getElementById('myRenderedElementId') !== null)).filter(c => c).take(1).map(c => {
       // run custom javascript
    });

    elementId$.addListener({
        next: function (value) {
        },
        error: function (err) {
            alert('err: ' + name + ' ' + err);
        },
        complete: function () {
        }
    });