Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使meteor模板辅助程序在另一个模板渲染后重新运行/渲染?_Javascript_Meteor_Handlebars.js - Fatal编程技术网

Javascript 如何使meteor模板辅助程序在另一个模板渲染后重新运行/渲染?

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 @雨果-我按照

我在模板导航中有一个名为{{renderNav}}的模板助手

e、 g

在这个helper函数中,我想解析另一个helper在不同模板中的呈现输出

例如助手

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。