[英]Set the return value of Meteor JS Helper, inject this dynamically into template
编辑:
给定以下答案,使用Meteor Deps似乎是理想的游戏,因为我想在两个不同的模板之间共享数据,并且它应该对发生的任何变化都具有反应性。
需要说明的是:我的数据源是Template.reactiveTable
,目的地是Template.buttons
。 当数据在reactiveTable
的变化,我想按钮来反映这一点。
结束编辑
我想根据表的内容设置buttons
的值(特别是<h1>
值)。
button.html:
<template name="buttons">
{{#each testButtons }}
<button id="{{ name }}">{{ name }}</button>
{{/each}}
</template>
使用此硬编码后,它可以按预期工作(两个按钮呈现标记为Alice和Bob的按钮
UI.registerHelper('testButtons', function () {
return [
{ name: "Alice" },
{ name: "Bob" }
]
}
)
模板愉快地接受并呈现此对象数组 。 但是,当我动态生成对象数组时不行。
目标:为我的h1标签中包含的每个唯一单词生成一个按钮(几乎像博客标签一样)。
通过将我的帮助程序代码替换为下面的代码段(使用jquery解析<h1>
标签,生成要发送到模板的数组)。
假设html是:
<h1>foo</h1>
<h1>bar</h1>
<h1>baz</h1>
然后在控制台中运行以下代码段,将创建uniqStrings = [ "foo", "bar", "baz"];
如预期的。
$( 'h1' ).map(function () {
var words = [];
words.push($(this).text());
uniqStrings = _.uniq(words);
});
然后如何将uniqStrings
发送回我的按钮模板以呈现n= uniqStrings.length
按钮? 谢谢!
假设此html:
<body>
<h1>Alice</h1>
<h1>Bob</h1>
{{> buttons}}
</body>
<template name="buttons">
{{#each testButtons }}
<button id="{{ name }}">{{ name }}</button>
{{/each}}
</template>
您可以将其与以下实现一起使用:
Template.buttons.helpers({
testButtons: function() {
var words = UI._templateInstance().state.get('words');
return _.map(words, function(word) {
return {name: word};
});
}
});
Template.buttons.rendered = function() {
var words = $('h1').map(function() {
return $(this).text();
});
this.state.set('words', _.uniq(words));
};
Template.buttons.created = function() {
this.state = new ReactiveDict;
};
注意,您需要执行以下操作: meteor add reactive-dict
创建buttons
模板时,将初始化其自己的内部反应状态。 呈现后,它将用页面上所有h1
标签的文本填充该状态。 因为该状态是反应性的,所以它将导致testButtons
运行并将正确格式的数据返回到您的模板。 请参阅我关于范围反应性的文章以了解更多详细信息。
由于buttons
模板使用作用域范围的反应性,因此可以在任意页面上随意使用它多次,而无需修改父模板。
虽然我不清楚您为什么要尝试解析一个表的内容,然后将其呈现到另一个表中(这是您要执行的,不是吗?),但是基本原理如下:
当模板的任何反应性依赖项发生更改时,模板将重新呈现。 因此,这意味着您需要:
从应用程序结构的角度来看,后者可能不太好,但最容易举例说明:
var renderDep = new Deps.Dependency(),
words = [];
UI.registerHelper('testButtons', function () {
renderDep.depend();
return words;
});
然后,只要您致电:
$( 'h1' ).map(function () {
words = [];
words.push($(this).text());
uniqStrings = _.uniq(words);
});
确保您致电:
renderDep.changed();
之后,它的所有依赖项(即模板帮助程序)将重新运行并返回新words
内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.