Установите параметр переменной в шаблон в Meteor.js

Можно ли создать переменную, привязанную к шаблону? Эта переменная может быть разделена между различными помощниками в шаблоне, но не существует вне шаблона.

В этом примере ниже, как можно распределять переменную game между двумя шаблонами без повторения ее определения? Инициализация с помощью var делает его глобальным, что не то, что я хочу. Спасибо!

Template.userInfo.game = function() {
    var game = 'Angry Bird';
    return game + ' game';
};

Template.userInfo.score = function() {
    var game = 'Angry Bird';
    return game + ' score';
};

Ответ 1

Если кто-то еще спотыкается об этом и использует Meteor 1.0, вот как вы можете это сделать.

Template.name.onCreated(function(){
    this.data.variableName = "something";
});

Template.name.helpers({
    'helper' : function() {
        return Template.instance().data.variableName;
    }
});

Таким образом, переменная привязана к экземпляру созданного шаблона. У меня есть страница, которая использует несколько экземпляров одного и того же шаблона, поэтому это было очень полезно.

EDIT:

Таким образом, это отлично работало для шаблонов, вложенных в другой шаблон, но не так хорошо работало с родительским шаблоном. Свойство data не содержало значений, поэтому я сделал еще несколько исследований и нашел this в примере для Template.onCreated, у них есть this.highlightedPicture = new ReactiveVar(null);, поэтому, по-видимому, это нормально определите новые свойства в экземпляре Template. Я пробовал это в обоих сценариях, и он отлично работает с Template.instance().

Ответ 2

Почему бы не использовать

Template.foo.created = function() {
    this._someVariable = "some value"
}

Template.foo.someHelper = function() {
    return this._someVariable
}

Template.foo.events({
    "click #mylink": function(event, tmpl) {
        console.log(tmpl._someVariable)
    }
})

Ваш частный _someVariable не реагирует, он служит для опций в этом случае. Но вы можете обернуть Deps.Dependency(), чтобы получить частные реактивные переменные Template

Ответ 3

Из документов: http://docs.meteor.com/#namespacing

Просто объявите его с помощью var, и это будет область файла. Без var это будет глобальная область.

var game = 'Angry Bird'; // File scope.
game2 = 'Angry Bird'; // App scope.

Ответ 4

У меня возникла проблема использования области автозапуска и переменной, поэтому, возможно, это поможет кому-то:

Template.foo.someHelper = function() {
     return this._someVariable
}

Template.foo.events({
     "click #mylink": function(event, tmpl) {
          console.log(tmpl._someVariable)
      }
})
Template.foo.onRendered(function() {
      this._someVariable = "some value"
      this.autorun(function(templateInstance) {
            Collection.find({}).fetch(); // Autorun will be executed each time this collection has change (update, delete, insert)
            console.log(templateInstance._someVariable);
      }, this.templateInstance());
});

Ответ 5

Вы можете создать его как реактивный var в onCreated, а затем вернуть эту переменную в помощнике. Везде, где вы set, эта переменная автоматически обновит вспомогательное значение. Вот пример:

Template.foo.onCreated(function() {
    this.yourVar = new ReactiveVar("");
    this.yourVar.set("initValue");
});

Template.foo.helpers({
    yourVar(){
        return Template.instance().yourVar.get();
    }
});

Template.foo.events({
    'click .btn': function (event) {
        template.yourVar.set($(event.target).val());
    }
});

Теперь вы можете вызвать {{yourVar}} в любом месте вашего шаблона и изменить его значение, как указано выше.