【问题标题】:Appending an element to a page in VoltRb将元素附加到 VoltRb 中的页面
【发布时间】:2015-06-22 21:50:46
【问题描述】:

我正在尝试通过 opal 浏览器将元素附加到 Volt 项目中的一个页面,如下所示:

if RUBY_PLATFORM == 'opal'
  require 'browser'
  $document.body << my_dom_element.to_n
end
# controller code below

很遗憾,我遇到了一个错误:

[Error] TypeError: null is not an object (evaluating 'value.nodeType')
    (anonymous function) (main.js, line 7772)

我添加的 DOM 元素非常完美。只是下面的代码:

document.createElement( 'myElement' )

我假设 Volt 不喜欢我将元素附加到控制器中的页面,而不是在视图 HTML 文件中手动创建它。有没有办法解决这个问题?我有点需要做这个元素附加的事情,以便与我与 Volt 一起使用的另一个库兼容。

【问题讨论】:

  • 你怎么称呼这段代码?你能在某处显示完整的文件吗?我怀疑这是在 DOM 准备好之前调用的。
  • @Ryan 以下是相关文件的完整代码:gist.github.com/ylluminarious/…。仅供参考,这是开箱即用的main_controller.rb 文件,正如您在要点中看到的那样,我试图将元素附加到的页面是开箱即用的“关于”页面。

标签: html ruby opalrb voltrb


【解决方案1】:

好的,所以问题是您拥有的代码会在已编译的 .js 文件加载后立即加载。 DOM 准备好后,您需要运行代码。在 volt 中执行此操作的简单方法是在 {action}_ready 方法上运行它:

module Main
  class MainController < Volt::ModelController
    def index_ready
      # run view code here
    end
  end
end

index_ready 方法会在 index view 渲染完成并且 dom 准备好之后被调用。

【讨论】:

  • 射击,我想我在调用代码的位置上错了。我删除了 $render.call 行,得到了相同的响应,并尝试了 {action}_ready 方法。我想问题一定出在其他地方。
  • 在你给出的例子中,它试图做: $render Proc 之外的 $document.body
  • 啊,好的。我明白你在说什么。我用 _ready 方法运行了整个过程,现在它似乎工作正常。谢谢! :)
猜你喜欢
  • 2012-04-11
  • 2012-09-19
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 2020-11-09
相关资源
最近更新 更多