ExecJS:保持两次调用之间的上下文
ExecJS: keeping the context between two calls
我目前正在尝试使用 ExecJS 来 运行 我工作的产品之一的车把(注意:我知道 handlebars.rb gem 这真的很酷而且我使用了一段时间,但在 Windows 上安装时遇到问题,所以我尝试了另一种自制解决方案)。
我遇到的一个问题是 Javascript 上下文没有保留在每个 "call" 到 ExecJS 之间。
这里是我实例化@js 属性的代码:
class Context
attr_reader :js, :partials, :helpers
def initialize
src = File.open(::Handlebars::Source.bundled_path, 'r').read
@js = ExecJS.compile(src)
end
end
这是一个显示问题的测试:
let(:ctx) { Hiptest::Handlebars::Context.new }
it "does not keep context properly (or I'm using the tool wrong" do
ctx.js.eval('my_variable = 42')
expect(ctx.js.eval('my_variable')).to eq(42)
end
现在当我 运行 它时:
rspec spec/handlebars_spec.rb:10 1 ↵
I, [2015-02-21T16:57:30.485774 #35939] INFO -- : Not reporting to Code Climate because ENV['CODECLIMATE_REPO_TOKEN'] is not set.
Run options: include {:locations=>{"./spec/handlebars_spec.rb"=>[10]}}
F
Failures:
1) Hiptest::Handlebars Context does not keep context properly (or I'm using the tool wrong
Failure/Error: expect(ctx.js.eval('my_variable')).to eq(42)
ExecJS::ProgramError:
ReferenceError: Can't find variable: my_variable
注意:我在使用 "exec" 而不是 "eval" 时遇到了同样的问题。
这是一个愚蠢的例子。我真正想做的是 运行 "Handlebars.registerPartial" 和后来的 "Handlebars.compile"。但是当试图在模板中使用部分时它失败了,因为之前注册的部分丢失了。
请注意,我找到了一个解决方法,但我发现它很丑陋:/
def register_partial(name, content)
@partials[name] = content
end
def call(*args)
@context.js.call([
"(function (partials, helpers, tmpl, args) {",
" Object.keys(partials).forEach(function (key) {",
" Handlebars.registerPartial(key, partials[key]);",
" })",
" return Handlebars.compile(tmpl).apply(null, args);",
"})"].join("\n"), @partials, @template, args)
end
知道如何解决这个问题吗?
只有您在调用 ExecJS.compile
时创建的上下文会在评估之间保留。您想要保留的任何内容都需要成为初始编译的一部分。
我目前正在尝试使用 ExecJS 来 运行 我工作的产品之一的车把(注意:我知道 handlebars.rb gem 这真的很酷而且我使用了一段时间,但在 Windows 上安装时遇到问题,所以我尝试了另一种自制解决方案)。
我遇到的一个问题是 Javascript 上下文没有保留在每个 "call" 到 ExecJS 之间。
这里是我实例化@js 属性的代码:
class Context
attr_reader :js, :partials, :helpers
def initialize
src = File.open(::Handlebars::Source.bundled_path, 'r').read
@js = ExecJS.compile(src)
end
end
这是一个显示问题的测试:
let(:ctx) { Hiptest::Handlebars::Context.new }
it "does not keep context properly (or I'm using the tool wrong" do
ctx.js.eval('my_variable = 42')
expect(ctx.js.eval('my_variable')).to eq(42)
end
现在当我 运行 它时:
rspec spec/handlebars_spec.rb:10 1 ↵
I, [2015-02-21T16:57:30.485774 #35939] INFO -- : Not reporting to Code Climate because ENV['CODECLIMATE_REPO_TOKEN'] is not set.
Run options: include {:locations=>{"./spec/handlebars_spec.rb"=>[10]}}
F
Failures:
1) Hiptest::Handlebars Context does not keep context properly (or I'm using the tool wrong
Failure/Error: expect(ctx.js.eval('my_variable')).to eq(42)
ExecJS::ProgramError:
ReferenceError: Can't find variable: my_variable
注意:我在使用 "exec" 而不是 "eval" 时遇到了同样的问题。
这是一个愚蠢的例子。我真正想做的是 运行 "Handlebars.registerPartial" 和后来的 "Handlebars.compile"。但是当试图在模板中使用部分时它失败了,因为之前注册的部分丢失了。
请注意,我找到了一个解决方法,但我发现它很丑陋:/
def register_partial(name, content)
@partials[name] = content
end
def call(*args)
@context.js.call([
"(function (partials, helpers, tmpl, args) {",
" Object.keys(partials).forEach(function (key) {",
" Handlebars.registerPartial(key, partials[key]);",
" })",
" return Handlebars.compile(tmpl).apply(null, args);",
"})"].join("\n"), @partials, @template, args)
end
知道如何解决这个问题吗?
只有您在调用 ExecJS.compile
时创建的上下文会在评估之间保留。您想要保留的任何内容都需要成为初始编译的一部分。