如何使用 Blaze.getData() 从 Meteor 中的视图中提取数据上下文
How to pull the data context from a view in Meteor using Blaze.getData()
我在我的一个 Meteor 模板中有一个选择输入,其中包含与每个选择选项关联的三条数据。我正在尝试将所有三条数据(作为对象)发送到一个新模板,该模板通过 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'));
}
});
有问题的模板 selectItem 没有数据上下文,这就是它不起作用的原因。 Blaze 通过查找相应的帮助程序函数来呈现{{#each items}}
,但这不是模板数据上下文的一部分,因此无法从事件处理程序中检索它。
解决此问题的最简单方法是在从周围的正文模板调用 selectItem 模板时设置该模板的数据上下文,如下所示:
Template.body.helpers({
items: function() {
return Items.find(); //or Items, or whatever
}
});
和
<body>
<h1>Select an item</h1>
{{> selectItem items=items}}
<div id="results"></div>
</body>
这样,您在事件处理程序中检索的数据上下文将包含 items
,尽管您随后如何处理它取决于您。
如果你想继续按照你的方式做事,明智的做法就是直接拿起 items 数组,因为它在你的事件处理程序的 JS 范围内。 如果你真的想通过帮助程序函数做事,你可以尝试:
Template.selectItem.__helpers[' items'].apply(Template.instance())
但是,这将使用私有方法,实际上不建议使用。另外,无论如何,它都会重新运行帮助程序,而不是真正返回相同运行的结果,这似乎是您所追求的。
Blaze.getData
才能从元素中获取数据,否则:
Template.selectItem.events({
'change .select_item': function(event,template) {
this//->data from event.target
template.data //->data from current template
Blaze.getData(event.target)//data from event.target
})
编辑:
我没有看你的流星垫对不起。
您的活动已绑定到您的select
。当它被触发时,您将在event.target
中将select
作为目标,您将在event.target.value
中获得price
。
你可以使用这个:
1.在集合中构建数据
var Items = new Mongo.Collection(null)
[
{
price: 500,
name: 'apple',
unit: 'bushel'
},
{
price: 1000,
name: 'bananas',
unit: 'kilo'
},
{
price: 2000,
name: 'cake',
unit: 'slice'
}
].forEach(function(o){
Items.insert(o)
});
2.遍历项目并给出_id
作为值
Template.selectItem.helpers({
items: function()
{
return Items.find()
}
});
<template name="selectItem">
<select name="item" class="select_item" style="width: 50%;">
<option></option>
{{#each items}}
<option value="{{this._id}}">{{this.name}}</option>
{{/each}}
</select>
</template>
3.使用Items.findOne(event.target.value)
获取所选项目
Template.selectItem.events({
'change .select_item': function(event,template) {
Blaze.renderWithData(Template.selectedResults, Items.findOne(event.target.value), document.getElementById('results'));
})
- 如何使用javascript从主svg对象动态创建svg视图框
- 正在使用$location.path(.)路由ng视图
- angular.js没有'无法在PhoneGap中处理视图标记
- 如何包含特定于每个视图angularjs的javascript文件
- 通过在Dojo mobile ViewController.openExternalView中动态更改打开同一外部视图的
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- Ajax Live搜索发布到Laravel视图
- backbone.js无法渲染视图
- 根据某些条件在视图之间切换
- 在数据提取完成之前进行页面渲染
- ng视图外的链接重定向到ng视图内的页面
- 如何在Jquery中发布后将值从视图返回到控制器
- 主干提取模型然后渲染视图
- 在MVC视图中的变量中使用javascript 从@模型中提取
- 从SQlite中提取Lat-Long并在网络视图中显示
- 如何使用 Blaze.getData() 从 Meteor 中的视图中提取数据上下文
- 主干视图在模型完成提取后获取模型变量
- 主干视图在辅助提取时未更新
- CouchDB:访问_design视图或提取文档字段的替代方法是什么
- 如何在从多个url提取模型时呈现视图