Javascript 如何使meteor模板辅助程序在另一个模板渲染后重新运行/渲染?
我在模板导航中有一个名为{{renderNav}}的模板助手 e、 g 在这个helper函数中,我想解析另一个helper在不同模板中的呈现输出 例如助手Javascript 如何使meteor模板辅助程序在另一个模板渲染后重新运行/渲染?,javascript,meteor,handlebars.js,Javascript,Meteor,Handlebars.js,我在模板导航中有一个名为{{renderNav}}的模板助手 e、 g 在这个helper函数中,我想解析另一个helper在不同模板中的呈现输出 例如助手 Template.contentWindow.content 它为 {{content}} 我的renderNav助手希望分割替换{{content}的html,以生成 {{renderNav}} 我该怎么做?现在{{renderNav}}帮助程序执行for或运行得更快,因此它无法解析替换{{content}的html @雨果-我按照
Template.contentWindow.content
它为
{{content}}
我的renderNav助手希望分割替换{{content}的html,以生成
{{renderNav}}
我该怎么做?现在{{renderNav}}帮助程序执行for或运行得更快,因此它无法解析替换{{content}的html
@雨果-我按照你的建议在代码中做了如下操作
Template.contentWindow.rendered = function() {
debugger;
return Session.set('entryRendered', true);
};
Template.Nav.renderNav = function() {
debugger;
var forceDependency;
return forceDependency = Session.get('entryRendered');
};
当我运行它时,调试器在执行renderNav助手时首先停止。(就我所看到的比赛条件而言,这是有道理的)。然后contentWindow渲染,我点击Session.set('entryRendered',true)上方的断点。但是renderNav不会像您建议的那样再次运行。我是否误解了您的建议或错误地执行了您的建议?您需要在模板中设置一个依赖项,以便重新运行。根据您想要获取的数据,几乎没有可能 例如,可以在
content
模板中设置一个反应标记,该标记将通知renderNav
已完成绘图
Template.contentWidnow.rendered = function() {
...
// Set this on the very end of rendered callback.
Session.set('contentWindowRenderMark', '' +
new Date().getTime() +
Math.floor(Math.random() * 1000000) );
}
Template.renderNav.contentData = function() {
// You don't have to actually use the mark value,
// but you need to obtain it so that the dependency
// is registered for this helper.
var mark = Session.get('contentWindowRenderMark');
// Get the data you need and prepare for displaying
...
}
根据您提供的进一步信息,我们可以创建这样的代码: content.js
Content = {};
Content._dep = new Deps.Dependency;
Template.contentWidnow.rendered = function() {
Content.headers = this.findAll(':header');
Content._dep.changed();
}
Template.renderNav.contentData = function() {
Content._dep.depend();
// use Content.headers here
...
}
contentWindow.js
Content = {};
Content._dep = new Deps.Dependency;
Template.contentWidnow.rendered = function() {
Content.headers = this.findAll(':header');
Content._dep.changed();
}
Template.renderNav.contentData = function() {
Content._dep.depend();
// use Content.headers here
...
}
renderNav.js
Content = {};
Content._dep = new Deps.Dependency;
Template.contentWidnow.rendered = function() {
Content.headers = this.findAll(':header');
Content._dep.changed();
}
Template.renderNav.contentData = function() {
Content._dep.depend();
// use Content.headers here
...
}
如果您希望在contentWindow呈现时自动重建导航,正如Hubert OG所建议的那样,您还可以使用更干净、更低级别的方法使上下文无效:
var navDep = new Deps.Dependency;
Template.contentWindow.rendered = function() {
...
navDep.changed();
}
Template.renderNav.contentData = function() {
navDep.depend();
// Get the data you need and prepare for displaying
...
}
有关更多信息,请参阅
另一方面,如果要手动渲染另一个模板,可以将其作为函数调用:
var html = Template.contentWindow();
返回的html不会是反应性的。如果需要反应性,请使用:
var reactiveFragment = Meteor.render(Template.contentWindow);
有关如何工作的详细信息,请参阅on Spark and Responsibility上的屏幕广播
更新
要将渲染片段添加到DOM中,请执行以下操作:
document.body.appendChild(Meteor.render(function () {
return '<h1>hello</h1><b>hello world</b>';
}));
不确定你的目标是什么。假设
content
在renderNav
之前结束。如何从renderNav
中访问content
html?我正在尝试从renderNav助手中访问content助手呈现的html。这导致了一种竞争条件,renderNav首先执行,并且无法访问content helper发布的DOM HTML。尽管您可以破解它,但听起来您做的事情似乎有误。为什么需要自己渲染的模板的DOM?您应该在renderNav
上下文中拥有所需的所有数据。也许你可以添加一些renderNav
代码来解释它如何使用content
DOM段。你可能是对的,我不是以一种非常快速的方式来做的。。。在这种情况下,代码片段不是很具有描述性,但解释是。。。{{content}}帮助器呈现为包含任意数量标题(H1、H2、H3等)的页面;renderNav助手是侧边栏模板的一部分,该模板解析这些标题的内容,并有效地构建一个目录——因此我不知道如何将内容助手生成的html传递给renderNav助手查看对我答案的更新。有帮助吗?雨果,我明白你的建议,但似乎不起作用。我对上面的问题进行了编辑,向您展示了我根据您的建议所做的尝试。设置true
不应该起作用。因为除了第一次,它不会改变值。使用Random
或更好的Deps.Dependency
是的,在我的示例中,我使用Date()
甚至添加一些Random()
来确保值已更改。自定义Deps.Dependency
是另一种有效的方法,甚至比Session
更好(更低级别)-前提是您有一种很好的方法来共享模板文件之间的依赖关系。最后一个问题我保证!我实现了这个,但是现在得到了控制台异常:来自Deps的异常重新计算:TypeError:无法读取Null的属性'nodeType',顺便说一句,它是Hubert,不是Hugo:)我确实认为这是正确的,但对我不起作用,所以我会继续挖掘。。。使用Deps.Dependency方法,contentData助手会按照预期首先执行,然后contentWindow.rendered执行调用navDep.changed(),这反过来会触发contentData助手再次运行(这正是我想要的!),不幸的是,contentData助手似乎返回了正确的html,不会向DOM呈现任何内容,也不会再次执行任何帮助程序(在我将内容呈现到DOM之前,它只是前几页的内容,而不是当前页面),您是否在RenderAV中使用reactiveFragment?然后你要创建一个依赖循环,其中contentWindow依赖于RenderAv,RenderAv依赖于contentWindow。不,我只是插入了你在文章前半部分中显示的navDep代码,而其他内容保持不变。我并不完全清楚在这种情况下如何使用reactiveFragment代码。我将其称为Meteor.render(Template.contentWindow);然后在返回的html而不是DOM html上进行Nav解析?我更新了答案,以更详细地解释reactiveFragments。