2014-10-01 3 views
7

У меня есть массив имен пользователей, которые я рендеринг в списке следующим образом:#each строка в массиве с пламенем в Метеоре

{{#each contacts}} 
<div class="name">{{this}}</div> 
{{/each}} 

Это работает просто отлично, но я стараюсь, чтобы получить имя пользователя из событие:

'click .name': function(e,t){ 
console.log(this) 
} 

Я получаю это расстраивает объект String {0: "c", 1: "h", 2: "a", 3: "r", 4: "l", 5: "i", 6: "e", length: 7, [[PrimitiveValue]]: "charlie"}, что делает его очень сложно сделать сравнение строк с. Любые идеи, почему это даже проблема или что с этим делать?

+0

Вы попробовали this._id – yoK0

ответ

12

В целом в Javascript контекст должен быть объектом, а не примитивным (link). Предположительно, contacts представляет собой всего лишь массив строк, поэтому в каждом теге div эти строки помещаются в коробку (т. Е. Отбрасываются ссылочным типом, в данном случае объектом String). Это то, что вы регистрируете здесь - объект String, а не ваш оригинальный примитив.

У вас есть два варианта:

  1. если вы используете this.valueOf() это даст вам элементарную строку назад.
  2. В качестве альтернативы, подумайте о создании контактов с массивом объектов (например, [{value: 'nameOne'}, ...]). Таким образом, вы можете заменить {{this}} на {{value}} и this в вашем обработчике событий, который вернет вам объект в том же формате, который вы ему предоставили.
9

Я думаю, когда вы используете {{this}} в шаблоне, а базовые данные - строковый литерал, он преобразуется в String object. В целях манипулирования строками вы не увидите различий (фактически, литералы преобразуются в объекты за кулисами, когда на них вызывают методы). Однако это выглядит странно, когда вы пишете его на консоли. Вы можете просто сделать: console.log(this.toString()); или console.log(String(this));.