2013-11-14 10 views
5

The bug source code is here.Meteor Lenker {{#if}} verwandelt Strings in Objekte

Nehmen wir an, ich bin über ein Array in Meteor mit einer gewöhnlichen {{#each}} Schleife Looping. Jedes Array-Element ist eine Zeichenfolge, und ich gebe die Zeichenfolge jeden Schritt mit {{this}} aus. So weit, ist es gut! Wenn ich einen Lenkerhelfer verwende, um typeof für this zu überprüfen, bekomme ich string. Süss! Alles ist so wie es sein sollte.

Aber wenn ich eine {{#if something }} -helper innerhalb des {{#each}} hinzufügen (die something nur true zurückgibt und damit in Gang hält und Ausgänge {{this}}) die Zeichenfolge wird noch im HTML gut aussehen, aber es ist jetzt eine object in der typeof Check!

Dies ist super-nervig wie alle (typeof someVarINeedToTest === 'string') mein Code möglicherweise davon ab, jetzt wird false zurückgeben.

Mache ich etwas falsch?

Oder ist das ein tatsächlicher Fehler?

Wenn ja: Ist es ein meteorspezifischer oder Lenkerspezifischer Bug?

Danke!

Oh: the source link again. Ziehen Sie einfach meteor und suchen Sie in Ihrer Browserkonsole.

Antwort

5

Dies liegt daran, die this Variable immer soll so in JavaScript ein Objekt sein, wenn someFunction.apply(someContext); in durch Lenker genannt wird, JavaScript someContext in ein Objekt verwandelt, egal was es begann als. Sehen Sie ein Beispiel hier: http://jsfiddle.net/SyKSE/1/

(. In diesem Fall someFunction den Teil der Vorlage darstellt, die innerhalb der {{#if}} Aussage ist)

Eine einfache (wenn auch hässlich) Abhilfe wäre, nur Ihre Daten stets in so passieren ein Objekt, so

['this', 'is', 'an', 'array', 'that', 'we\'re', 'looping', 'through']; 

wird:

[{val: 'this'}, {val: 'is'}, {val: 'an'}, {val: 'array'}, {val: 'that'}, {val: 'we\'re'}, {val: 'looping'}, {val: 'through'}]; 

Und dann würden Sie Ihre Vorlage ändern schaue auf val statt this

+1

Prost, große Antwort! –

+0

Vielen Dank - gute Arbeit an einem einfach zu bedienenden Testfall :) –

+0

Eine andere Problemumgehung, die Sie beim Vergleich von Strings verwenden können: _.isEqual (this, stringToCompareAgainst). Beachten Sie auch, dass Template.currentData() eine Zeichenfolge und kein Object zurückgibt – JobJob