Создание хелпера шаблона в Метеор

Я создаю приложение чата, и на моей странице "Новые чаты" у меня есть список контактов, которые вы можете выбрать один за другим, нажав на них (на которых я применяю выбранный класс CSS и нажимаю идентификатор пользователя в массив, называемый "newChatters".

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

Шаблон, который я хочу отобразить в списке:

<template name="newChatDetails">
  <div class="contactHeader">
    <h2 class="newChatHeader">{{newChatters}}</h2>
  </div>
</template>

Событие click contactItem запускается при каждом контакте:

Template.contactsLayout.events({
 'click #contactItem': function (e) {
   e.preventDefault();
   $(e.target).toggleClass('selected');
   newChatters.push(this.username);
...

Массив newChatters обновляется правильно, поэтому до этого момента все работает нормально. Теперь мне нужно обновить {{newChatters}}. Вот что я пробовал, но это не так и не работает:

Template.newChatDetails.helpers({
  newChatters: function() {
    return newChatters;
  }
});

Как и где использовать Deps.autorun(), чтобы сделать это? Нужна ли мне это, так как я думал, что вспомогательные методы автоматически обновляются по недействительности?

Ответ 1

1) Определите Tracker.Dependency в том же месте, где вы определяете свой объект:

var newChatters = [];
var newChattersDep = new Tracker.Dependency();

2) Используйте depend() перед чтением с объекта:

Template.newChatDetails.newChatters = function() {
  newChattersDep.depend();
  return newChatters;
};

3) Используйте changed() после того, как вы напишете:

Template.contactsLayout.events({
  'click #contactItem': function(e, t) {
    ...
    newChatters.push(...);
    newChattersDep.changed();
  },
});

Ответ 2

Для этого вы должны использовать объект Session.

Template.contactsLayout.events({
 'click #contactItem': function (e) {
   //...
   newChatters.push(this.username);
   Session.set('newChatters', newChatters);
 }
});

а затем

Template.newChatDetails.helpers({
  newChatters: function() {
    return Session.get('newChatters');
  }
});

Ответ 3

Вы можете использовать локальный Meteor.Collection курсор в качестве реактивного источника данных:

var NewChatters = new Meteor.Collection("null");

Шаблон:

<template name="newChatDetails">
  <ul>
    {{#each newChatters}}
      <li>{{username}}</li>
    {{/each}}
  </ul>
</template>

Событие:

Template.contactsLayout.events({
  'click #contactItem': function (e) {
    NewChatters.insert({username: this.username});
  }
});

Helper:

Template.newChatDetails.helpers({
  newChatters: function() { return NewChatters.find(); }
});

Ответ 4

Чтобы сопоставить поведение Session без загрязнения Session, используйте ReactiveVar:

 Template.contactsLayout.created = function() {
      this.data.newChatters = new ReactiveVar([]);
 }

 Template.contactsLayout.events({
      'click #contactItem': function (event, template) {
            ...
            template.data.newChatters.set(
                template.data.newChatters.get().push(this.username)
            );
           ...

Затем во внутреннем шаблоне используйте исходный реактивный источник данных:

 Template.newChatDetails.helpers({
      newChatters: function() {
           return Template.parentData(1).newChatters.get();
      }
 });

Ответ 5

для людей, которые ищут обходной путь для этого в 2015 году + (начиная с 2014 года).

Я реализую мастер сообщений pw_module, где мне нужно оперативно обновлять данные в зависимости от параметров маршрута:

Router.route('/new-post/:pw_module', function(){
    var pwModule = this.params.pw_module;
    this.render('post_new', {
        data: function(){
            switch (true) {
                case (pwModule == 'basic-info'):
                    return {
                        title: 'Basic info'
                    };
                    break;
                case (pwModule == 'itinerary'):
                    return {
                        title: 'Itinerary'
                    };
                    break;
                default:
            }
        }
    });
}, {
    name: 'post.new'
});

Позже в шаблоне просто выполните:

<h1>{{title}}</h1>

Изменение маршрутов

Навигация, который обновляет URL-адрес, выглядит следующим образом:

<nav>
    <a href="{{pathFor route='post.new' pw_module='basic-info'}}">Basic info</a>
    <a href="{{pathFor route='post.new' pw_module='itinerary'}}">Itinerary</a>
</nav>

Надеюсь, что это все еще помогает кому-то.