如何使用Blaze.getData()从Meteor中的视图中提取数据上下文

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)

ric*_*ilv 5

有问题的模板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())

但是,这将使用私有方法,因此不建议这样做。另外,无论如何它将重新运行该辅助程序,而不会真正返回相同运行的结果,这似乎是您所追求的。