Javascript 在非集合的回调中使用此函数

Javascript 在非集合的回调中使用此函数,javascript,meteor,handlebars.js,Javascript,Meteor,Handlebars.js,我现在正在浏览这个示例,我已经完成了,但是我对add功能的实现并不完全满意 首先,我们有 Template.player.events({ 'click': function () { Session.set("selected_player", this._id); } }); 我发现它与播放器集合的关联有点混乱,但我想这与有关,每个事件处理程序都有两个参数:事件和模板。您可以在此处阅读有关这些事件处理程序参数的更多信息: target是对发起事件的D

我现在正在浏览这个示例,我已经完成了,但是我对add功能的实现并不完全满意

首先,我们有

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;