2013-11-13 4 views
1

По какой-то причине я не могу позвонить своему помощнику в свой шаблон. Он выдает ошибку, говоря, что мой помощник не определен.Рекурсивный шаблон Ember/Handlebars

У меня есть следующий код:

<script type="text/x-handlebars" id="catalog"> 
    <div class="col-md-10"> 
     <ul class="list-group"> 
      {{#each catalog.catalog_categories}} 
       {{categoryHelper this}} // This works !!! 
      {{/each}} 
     </ul> 
    </div> 
</script> 

<script id="categories-template" data-template-name='test' type="text/x-handlebars-template"> 
    <a data-toggle="collapse" href=".collapse{{ category.category_id }}" data-target=".child{{ category.category_id }}"> 
     <li class="list-group-item"> 
      {{ category.category_name_fr_sh }} // French name of category 
     </li>  

    </a> 
    {{#if category.category_children}}  
     {{#each category.category_children}} 
      {{categoryHelper this}} // This throw error saying that the helper is undefined 
     {{/each}} 
    {{/if}} 
</script> 

//app.js 
Ember.Handlebars.helper('categoryHelper', function(category) { 
    var template = Handlebars.compile($('script#categories-template').html()); 
    return new Handlebars.SafeString(template({category: category})); 
}); 

EDIT: Вот jsfiddle http://jsfiddle.net/CycS8/

+0

@RoyDaniels Я обновил свой ответ со ссылкой на мой jsfiddle. Спасибо за помощь –

ответ

2

Когда уголек самозагрузка, он будет искать все шаблоны с селектором script[type="text/x-handlebars"], script[type="text/x-raw-handlebars"], и для каждого шаблона он будет компилировать с соответствующим двигателем компилятора:

Ember.Handlebars.compile для сценариев с type="text/x-handlebars и Handlebars.compile для type="text/x-raw-handlebars.

После компиляции метка сценария удаляется из dom.

Возможно, $('script#categories-template').html() в вашем помощнике ничего не возвращает. Потому что шаблон не находится в dom.

Я думаю, что следующий может работать:

шаблоны

<script type="text/x-handlebars" id="catalog"> 
    <div class="col-md-10"> 
     <ul class="list-group"> 
      {{#each catalog.catalog_categories}} 
       {{categoryHelper this}} 
      {{/each}} 
     </ul> 
    </div> 
</script> 

<script id="categories-template" type="text/x-raw-handlebars"> 
    <a data-toggle="collapse" href=".collapse{{ category.category_id }}" data-target=".child{{ category.category_id }}"> 
     <li class="list-group-item"> 
      {{ category.category_name_fr_sh }} // French name of category 
     </li>  
    </a> 
    {{#each category.category_children}} 
     {{categoryHelper this}} 
    {{/each}} 
</script> 

app.js

Ember.Handlebars.helper('categoryHelper', function(category) { 
    var template = Ember.TEMPLATES['categories-template']; 
    return new Handlebars.SafeString(template({category: category})); 
}); 

UPDATE

Ember обеспечивает помощник render зрения, я думаю, что вы можете получить эту работу, используя следующую:

<script id="catalog" type="text/x-handlebars"> 
    <div class="col-md-10"> 
     <ul class="list-group"> 
      {{#each catalog.catalog_categories}} 
       {{render "categories-template" this}} 
      {{/each}} 
     </ul> 
    </div> 
</script> 

<script id="categories-template" type="text/x-handlebars"> 
    <a data-toggle="collapse" href=".collapse{{ category.category_id }}" data-target=".child{{ category.category_id }}"> 
     <li class="list-group-item"> 
      {{ category.category_name_fr_sh }} // French name of category 
     </li>   
    </a> 
    {{#each category.category_children}} 
     {{render "categories-template" this}} 
    {{/each}} 
</script> 
+0

Спасибо, что нашли время ответить. Я попробовал то, что вы сказали, шаблон не определен после Ember.TEMPLATES ['categories-template']. Любая идея почему? –

+0

Добро пожаловать! Что 'Ember.keys (Ember.TEMPLATES)' показывается для вас? –

+0

Чтобы упростить задачу, я сделал экран печати. У вас слева, мой html (его .html.twig), справа от моего app.js, внизу - результат Chrome EmberJS Tool. http://i.imgur.com/1RFgmb1.png –

0

Ваш тип неправильно, он должен быть type="text/x-handlebars" в вашем test шаблоне.

+0

Конечно, теперь, когда я смотрю на ваш код, я не уверен, что он работает после компиляции, дайте мне посмотреть, смогу ли я настроить jsbin. – Kingpin2k

+0

К сожалению, это не работает. Возникает ошибка: вы должны передать строку или Handlebars AST в Handlebars.compile. Вы прошли неопределенно. Я думаю, это потому, что компиляция ожидает строку, и вы не можете получить строку из типа text/x-handlebars. –

Смежные вопросы