Javascript 在非集合的回调中使用此函数
我现在正在浏览这个示例,我已经完成了,但是我对add功能的实现并不完全满意 首先,我们有Javascript 在非集合的回调中使用此函数,javascript,meteor,handlebars.js,Javascript,Meteor,Handlebars.js,我现在正在浏览这个示例,我已经完成了,但是我对add功能的实现并不完全满意 首先,我们有 Template.player.events({ 'click': function () { Session.set("selected_player", this._id); } }); 我发现它与播放器集合的关联有点混乱,但我想这与有关,每个事件处理程序都有两个参数:事件和模板。您可以在此处阅读有关这些事件处理程序参数的更多信息: target是对发起事件的D
Template.player.events({
'click': function () {
Session.set("selected_player", this._id);
}
});
我发现它与播放器集合的关联有点混乱,但我想这与
有关,每个事件处理程序都有两个参数:事件和模板。您可以在此处阅读有关这些事件处理程序参数的更多信息:
target是对发起事件的DOM元素的引用。然后,您可以使用类似jQuery的遍历函数来获取附近的元素
您还可以将输入值设置为模板实例的属性。例如,在模板创建的处理程序中,创建名称和分数属性:
Template.player.created = function() {
this.name = '';
this.score = '';
};
然后更新输入文本框的keyup事件中的值:
'keyup #name': function(event, template) {
template.name = event.target.value;
},
'keyup #score': function(event, template) {
template.score = event.target.value;
}
这与为Ember制作的小部件更新其值的方式相同,如下所述:很高兴看到有人使用Meteor拥有如此多的街头信誉!获取值的最佳方法是使用数据上下文并从数据上下文中获取内容,还有一种方法不需要DOM知识
Template.player.events({
'keypress #name':function(event,context) {
//Get the event sending this' value
console.log(event.currentTarget.value)
//Traverse the DOM on the template 'player' in this case
console.log(context.find('#score').value)
}
});
基本上,获取发送方值的最佳方法是使用event.currentTarget
访问发送事件的对象的DOM
它以这种方式实现的原因可能是因为任何dom对象都可以发送事件,并且它不一定总是有值
字段,因此在处理事件映射时需要稍微了解dom,但使用event.currentTarget.value
适用于大多数表单字段
数据上下文
关于数据上下文,您应该能够使用来自助手的模板中可用的数据,例如,如果模板或助手中存在一个{{{score}
&一个{{name}}
值,在本例中,该值通过每个玩家的{each}
传递
this.name,
this.score;
这也是一样的(我通常在我的助手中使用上下文
,但模板
是另一种调用它的方式,我想就像TravelingProg的答案一样)
this
有助于将数据从模板的数据上下文获取到事件的数据上下文中,这样就不必使用包含数据的隐藏HTML属性,例如,与将播放器移除的方式相比,将\u id
存储在dom中的某个地方更干净。也就是说,event.currentTarget
或context.find(…)
是从文本字段获取数据的最佳方法。模板的参数用于什么?它是对模板当前实例的引用。您可以在其创建的处理程序中为该实例分配属性,该实例还具有某些函数。当我对解释感到满意时,我会接受;我希望不要使用event.target
,而是使用一些与事件绑定到的模板关联的对象,并以某种方式从中解压值,您可以在前面提到您不想使用event.target。我将编辑我的答案这并不是说我不想使用event.target
,我只是想找到最模块化的方法来实现这一点。使用event.target
需要DOM分析和DOM知识,但使用自动从元素创建的模型(至少由Meteor创建)更有意义。如果使用event.target
是唯一/最佳/标准的方法,那么这没关系,但是template
看起来也很有趣。关于您对单击事件的混淆:在模板事件处理程序中,这指的是当前模板实例的上下文。如果我没有记错排行榜示例,那么每个Template.player实例的上下文都是来自Players集合的文档。因此,这个.\u id为您提供了为该特定玩家自动生成的MongoDB\u id字段document@travellingprog我想你是对的,但是在上面的点击输入。添加事件中,没有玩家集合上下文;它在player
partialYep之外,所以如果您在另一个模板中,那么这将允许您访问该模板的上下文。@TravelingProg这很好。。。那么,我可以做些什么来让名称
和分数
输入的值以某种方式绑定到排行榜模板(或我可以绑定到的其他模板上下文?)在您的情况下,事件处理程序中的模板上下文将存储在上下文中。数据
,这会使您的名称方案混乱。变量context
实际上是对模板当前实例的引用。尽管如此,正如您所提到的,如果您想在事件处理程序中检索数据上下文,您可以只使用this
。我使用上下文
/模板
,因为this
在某些场景中并不总是有效。这是一个基于当时可用数据的上下文,因此我更喜欢上下文<代码>此
将返回此处所述的窗口。这更像是meteor的一个问题,但我更喜欢它,因为这个
有时会让我与Sencha项目混淆,一旦问题解决,它将始终是available@Akshat嗯,add
表单不是每个玩家的,而是每个排行榜(尽管只有一个排行榜)。我认为context.find
比document.getElement
更有意义,但是如何保证模板的上下文呢?还有什么简单的方法可以将名称输入(例如)的值与this.name
关联起来,即使用户键入了它也可以?至少,还有比travellingprog建议的更简单的方法吗?
'keyup #name': function(event, template) {
template.name = event.target.value;
},
'keyup #score': function(event, template) {
template.score = event.target.value;
}
Template.player.events({
'keypress #name':function(event,context) {
//Get the event sending this' value
console.log(event.currentTarget.value)
//Traverse the DOM on the template 'player' in this case
console.log(context.find('#score').value)
}
});
this.name,
this.score;
context.data.name,
context.data.score;