2013-11-21 4 views
10

Ist es möglich, eine Variable zu erstellen, die auf eine Vorlage beschränkt ist? Diese Variable kann unter den verschiedenen Helfern in der Vorlage verwendet werden, ist jedoch außerhalb der Vorlage nicht vorhanden.Setzen Sie einen Variablenbereich auf Vorlage in Meteor.js

In diesem Beispiel unten, wie kann game Variable zwischen den 2 Vorlagen geteilt werden, ohne seine Definition zu wiederholen? Initialisieren es mit var macht es global was ist nicht was ich will. Vielen Dank!

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

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

Antwort

2

Aus der Dokumentation: http://docs.meteor.com/#namespacing

erklären Sie es einfach mit einem var und es wird Dateigültigkeitsbereich sein. Ohne die Variable wird es globalen Geltungsbereich geben.

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

Warum nicht verwenden

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) 
    } 
}) 

Ihr privater _someVariable nicht reaktiv ist es für die Optionen in diesem Fall dient. Aber Sie können ein Deps.Dependency() umhüllen, um eine private reaktive Vorlage Variablen

+0

Der Helfer wird nicht funktionieren - Helfer haben globalen Geltungsbereich. – sbking

+0

Ahhhh, du hast Recht! Haben wir nicht eine Möglichkeit, die Vorlage für einen Helfer zu binden? – Roman

+0

Der Weg, dies zu tun ist, ein Argument an den Helfer aus dem HTML übergeben. Also wirklich, wenn Sie solche Sachen machen müssen, sollten Sie Ihre Modelle wahrscheinlich in Klassen abstrahieren. – sbking

7

zu erhalten Wenn jemand darüber stolpert und Meteor 1.0 verwendet, können Sie dies folgendermaßen erreichen.

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

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

Auf diese Weise wird die Variable auf die Instanz der Vorlage beschränkt, die erstellt wurde. Ich habe eine Seite, die mehrere Instanzen der gleichen Vorlage verwendet, so dass dies sehr nützlich war.

EDIT:

So arbeiteten diese perfekt für Vorlagen in einer anderen Vorlage verschachtelt, aber mit der übergeordneten Vorlage nicht so gut funktionieren. Die data Eigenschaft hielt keine Werte, also habe ich weitere Recherchen durchgeführt und this in dem Beispiel für Template.onCreated gefunden. Sie haben this.highlightedPicture = new ReactiveVar(null);, also ist es offensichtlich in Ordnung, neue Eigenschaften auf Ihrer Template-Instanz zu definieren. Ich habe dies in beiden Szenarien versucht und es funktioniert gut mit Template.instance().

+0

'this.data' ist ein Readonly by [offizielles Dokument] (http://docs.meteor.com/#/full/template_data). –

+1

hi Shaded, ich bin tatsächlich über dieses gestolpert (mit Meteor jetzt bei 1.2.1) und hoffte, dass du die Lösung für mich hast, aber fürchte, dass sich die Dinge geändert haben oder du die Lösung nicht richtig dokumentiert hast - im Grunde musst du alle Referenzen auf .data löschen und die Variablen einfach an die Vorlage anhängen - siehe https: //dweldon.silvrback.com/scoped-reactivity für ein wirklich gutes und leicht verdauliches Beispiel, wie es funktioniert. –

0

hatte ich einige Ausgabe Autorun und variable Umfang zu verwenden, so wird es vielleicht jemand helfen:

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()); 
}); 
0

Sie es als reaktives var im onCreated schaffen könnte dann diese Variable in einem Helfer zurück. Überall dort, wo Sie diese Variable set haben, wird der Hilfswert automatisch aktualisiert. Hier ein Beispiel:

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()); 
    } 
}); 

Jetzt können Sie {{yourVar}} überall in der Vorlage aufrufen und bearbeiten es Wert ist wie oben.