2013-04-02 1 views
0

Я сейчас использую пример leaderboard, и я его закончил, но я не полностью удовлетворен своей реализацией функции add.Используя это в обратном вызове для не-сбора

Начнем с того, мы имеем

Template.player.events({ 
    'click': function() { 
     Session.set("selected_player", this._id); 
    } 
}); 

Я нахожу это немного запутанным, как this связан с коллекцией игрока, но я думаю, что это связано с <template части. Я также могу сделать

Template.leaderboard.events({ 
    'click input.delete': function() { 
     Players.remove(this._id); 
    } 

... который удаляет игрока с соответствующей записью кнопки.


Теперь для фактического вопроса части: Я добавил это в нижней части лидеров шаблона:

<div> 
    Add player: (Name <input required name="name" id="name">) 
    (Score <input required name="score" id="score">) 
    <input class="add" type="button" value="Add"> 
</div> 

Это прекрасно работает, и я Template.leaderboard.events['click input.delete'] работает нормально, но для того, чтобы получить значения я использую:

'click input.add': function() { 
    var name = document.getElementById('name').value, 
     score = document.getElementById('score').value; 

было бы много смысла для меня, если бы я был в состоянии использовать this в некотором роде, или использовать это событие, чтобы каким-то образом получить значения, что-корреспондент на входах. Это не только имеет смысл для меня с точки зрения дизайна, но также будет охватывать случай одновременного отображения более одного из этих видов.

Итак, можно ли получить элементы, находящиеся рядом с целевым элементом, в контексте события?

+0

Что касается вашей путаницы с событием ** click **: внутри обработчика событий шаблона _this_ ссылается на контекст текущего экземпляра шаблона. Если я правильно помню пример _leaderboard_, контекст, заданный каждому экземпляру Template.player, является документом из коллекции Players. ** this._id ** поэтому дает вам поле MongoDB _id, которое было автоматически сгенерировано для этого конкретного документа Player – travellingprog

+0

@travellingprog Я думаю, что вы правы, но в событии 'click input.add' выше, нет игроков контекст коллекции; он находится вне части «игрока» –

+0

Да, поэтому, если вы находитесь в другом шаблоне, то _this_ предоставит вам доступ к контексту этого шаблона. – travellingprog

ответ

1

Каждый обработчик событий имеет два аргумента: событие и шаблон. Подробнее об этих аргументах обработчика событий вы можете прочитать здесь: http://docs.meteor.com/#eventmaps

event.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, обновляют свои значения, как описано здесь: http://www.emberist.com/2012/04/12/two-way-binding-to-the-dom.html

+0

Что используется аргумент 'template'? –

+0

Это ссылка на текущий экземпляр вашего шаблона. Вы можете назначить свойства этому экземпляру в обработчике _created_, а экземпляр также имеет определенные функции. Прочитайте http://docs.meteor.com/#template_inst – travellingprog

+1

Я соглашусь, когда меня устраивает объяснение; Я надеялся не использовать 'event.target', но использовать некоторый объект, который был связан с шаблоном, к которому привязано событие, и как-то распаковать значения из этого –

1

Приятно видеть кого-то с таким количеством уличного кредита, используя Meteor!Лучший способ, чтобы получить значение является с event.currentTarget и получить вещи из контекста данных есть и другой способ, который не нуждается в 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 может отправлять событие, и он не обязательно всегда имеет поле value, поэтому при обработке карт событий требуется небольшое знание DOM, но с использованием event.currentTarget.value работает для большинства полой формы

данных контексты

Что касается контекста данных, вы должны быть в состоянии использовать данные, доступные в шаблонах из помощников, например, если Theres {{score}} & значения {{name}} в шаблоне O r помощник, который передается в этом случае через {{#each}} для каждого отдельного игрока.

this.name, 
this.score; 

Что тоже так же, как (я обычно использую context в моем помощнике, но template другой способ callng это я думаю, как и в ответ travellingprog в)

context.data.name, 
context.data.score; 

this помогает получить данные из контекст данных шаблона в событии, чтобы не было необходимости использовать скрытые атрибуты HTML, содержащие данные, например, с тем, как проигрыватель удаляется его бит чище, чем хранение _id в доме где-то. При этом event.currentTarget или context.find(..) - лучший способ получить данные из текстового поля.

+0

В вашем случае контекст шаблона в обработчике события будет храниться в 'context.data', что делает вашу схему имени запутанной. Ваша переменная 'context' на самом деле является ссылкой на текущий экземпляр шаблона. Хотя, как вы сказали, если вы хотите получить контекст данных внутри обработчика событий, вы можете просто использовать 'this'. – travellingprog

+0

Я использую 'context' /' template', потому что 'this' не всегда будет работать в определенных сценариях. Это контекст, основанный на данных, доступных в то время, поэтому поэтому я предпочитаю контекст. 'this' вернет окно, как описано здесь http://stackoverflow.com/questions/15137206/the-context-of-this-in-meteor-template-event-handlers-using-handlebars-for-te/15149650? noredirect = 1 # comment21969567_15149650. Это больше проблема с метеоритом, но я предпочитаю это, потому что «это» иногда путает меня с проектами Sencha, как только проблема будет исправлена, он будет постоянно контекстом данных, где доступно – Akshat

+0

@ Хорошо, что форма 'add' не принадлежит игроку , только за Лидерборд (из которых только один). Я думаю, что 'context.find' имеет больше смысла, чем' document.getElement', но как я могу гарантировать контекст шаблона? Также есть ли простой способ связать значение ввода имени (например) с 'this.name', даже если оно было изменено путем ввода пользователем? По крайней мере, проще, чем предлагал travellingprog? –