bgm*_*ter 0 javascript meteor spacebars meteor-blaze
我的Meteor模板之一中有一个select输入,它具有与每个select选项相关的三段数据。我正在尝试将所有三个数据(作为对象)发送到新模板,该模板通过Blaze API在用户选择后触发的“更改”事件上呈现。我的印象是可以使用Blaze.getData方法执行此操作,但是它似乎对我不起作用。我想知道是否有人使用此方法有经验,并且可能能够帮助我进行故障排除。
我设置了一个MeteorPad,并提供了我在此处尝试执行的操作的示例:http ://meteorpad.com/pad/69XGm5nWPutg8an7T/Select%20Item
另外,这是相关的“更改”事件代码:
Template.selectItem.events({
'change .select_item': function(event) {
event.preventDefault();
var view = Blaze.getView(event.target);
console.log(view); // me debugging
var item = Blaze.getData(view);
console.log(item); // me debugging
Blaze.renderWithData(Template.selectedResults, item, document.getElementById('results'));
}
});
Run Code Online (Sandbox Code Playgroud)
有问题的模板selectItem没有数据上下文,这就是为什么它不起作用的原因。Blaze {{#each items}}通过查找适当的辅助函数进行渲染,但这不是模板数据上下文的一部分,因此您无法从事件处理程序中检索它。
解决此问题的最简单方法是,在从周围的主体模板调用selectItem模板时,设置它的数据上下文,如下所示:
Template.body.helpers({
items: function() {
return Items.find(); //or Items, or whatever
}
});
Run Code Online (Sandbox Code Playgroud)
和
<body>
<h1>Select an item</h1>
{{> selectItem items=items}}
<div id="results"></div>
</body>
Run Code Online (Sandbox Code Playgroud)
这样,您在事件处理程序中检索的数据上下文将包含items,尽管您随后如何处理将由您决定。
如果您想继续按照自己的方式做事,那么明智的选择就是直接拾取items数组,就像它在事件处理程序的JS范围内一样。如果您真的想通过助手功能执行操作,则可以尝试:
Template.selectItem.__helpers[' items'].apply(Template.instance())
但是,这将使用私有方法,因此不建议这样做。另外,无论如何它将重新运行该辅助程序,而不会真正返回相同运行的结果,这似乎是您所追求的。
| 归档时间: |
|
| 查看次数: |
2691 次 |
| 最近记录: |