2013-05-28 20 views
20

printArray adında bir yardımcım var. JS'deki diziyi tanımladığımda ve bir context nesnesi aracılığıyla yardımcıya aktardığımda harika çalışıyor. Ne yapmak istedikleri gibi, sağ şablonda dizi tanımlamak geçerli:Şablonda yazılı diziyi meteor/handlebars yardımcısına iletin

{{printArray arr=[1, 3, 4] }} 

Maalesef bu undefined, benim yardımcı için arr anahtar noktaları vardığında. Javascript'te tanımlamaksızın dizimdeki diziyi almak için geçerli bir sözdizimi var mı?

cevap

2

Sen olarak aşağıda bir dizi yardımcı tanımlayabilirsiniz şimdi

{{printArray arr=arrayValues}}

1

Dizinin yalnızca parantezli değerini geçmeyi denediniz mi?

{{printArray [1, 3, 4]}} 

Ben kolayca gidon yardımcı yöntemlere savların nesnelerde geçebilir biliyorum:

{{printArray {arr: [1, 3, 4]} }} 

bu müthiş yardımcı yöntemler bir göz atın, çoğu ben, başka bir yerden bir kaç çaldı hangi yazdım ya tweaked ... Onlar konuyla ilgili benim referans başlangıç ​​noktasıdır:

https://github.com/zeroasterisk/Presenteract/blob/master/client/lib/handlebar-helpers.js

+2

Bu harika görünüyorsun, ama bir şey yanlış anlama olmalı - Ben KAPAT ', 'DATA', 'STRING', 'INTEGER', 'boolean', 'kimliği' bekleniyor 'olsun, 'Eylül', var Nesnenin açılış küme ayracı üzerinde 'GEÇERSİZ'. Bu sözdizimi düz Gidonlara izin verebilir, ancak meteor'a izin verilmez mi? –

+0

Kodunuzun bağlantısı için teşekkürler. Bu yardımcıların nerede olduğunu söylebilir misin? –

+0

Burada, getSession 'https://github.com/zeroasterisk/Presenteract/blob/master/client/views/about.html#L68 – zeroasterisk

6

JavaScript enkullanabilirsinizdizisi böyle bir şeyi başarmak için. arguments dizisi, çağrıldığında işleve iletilen her değere erişim sağlar.

Bu böyle sözdizimi kullanmanızı sağlayacak:

kod şöyle
{{printArray 1 3 4}} 

:

Handlebars.registerHelper('printArray', function() { 
    //Last argument is the options object. 
    var options = arguments[arguments.length - 1]; 

    //Skip the last argument. 
    for(var i = 0; i < arguments.length - 1; ++i) { 
     //Do your thing with each array element. 
    } 

    //Return your results... 
    return ''; 
}); 
2

Neredeyse böyle bir yardımcı kullanarak, eval() kullanımı ile gerçekleştirebilirsiniz :

Handlebars.registerHelper('printArray', function(values) { 
    var array = eval(values); 

    if (array.constructor === Array()) { 
    ... 
    } 
} 

Yukarıdakiler bunu şablondan çağırmanızı sağlar:

{{printArray '[0, 1, 2]'}} 

Bu yöntemin bir uyarısı, dizinizi dizge olarak geçirmeniz gerektiğidir.

1

yapabileceğiniz bir dizi

Template.ArrayDemo.helpers({ 
    arrayValues: [1, 2, 3], 
    printArray: function(arr) { 
     for (i = 0; i < arr.length; i++) { 
      console.log(arr[i]); 
     } 
    } 
}); 

döndüren başka yardımcı kullanmak gerekir.

Handlebars.registerHelper('array', function() { 
    return Array.prototype.slice.call(arguments, 0, -1); 
} 

{{printArray (array 1 3 4)}}