2015-03-27 3 views
0

я следующие Помощники для простых сообщений в архиве:Метеор расслоение плотной - Консоль показывает «Неопределенный», даже если возвращение результат

Template.archive.helpers({ 
    itens: function() { 
     return Itens.find(); 
    } 
}); 

//singleExcerpt is the single item on archive loop 
Template.singleExcerpt.helpers({ 
    shortExcerpt: function() { 
     var a = this.text.slice(0,120); 
     return a+'...'; 
    } 
}) 

А на странице архива, в нем перечислены все сообщения и его shortExcerpt 120 символов, но все еще возвращает Undefined на консоли:

Exception in template helper: TypeError: Cannot read property 'slice' of undefined 

Кто-нибудь знает, что может быть проблемой здесь?

+0

Значит, он действительно работает, но бросает в точку? Возможно, у вас есть сообщение, у которого нет поля 'shortExcerpt'? Возможно, попробуйте/поймайте его и проверьте, какие сообщения бросаются. –

+0

Какие подписки у вас есть в коллекции 'Itens'? – user3374348

+0

Это была проблема, @Kyll, спасибо за понимание! Простой 'if (this.text) {' сделал трюк. Должны ли вы опубликовать его в качестве ответа, чтобы я наградил вас за правильность? Я совершенно новый о том, как работает переполнение стека. –

ответ

0

Таким образом, после обсуждения в комментариях вопрос, это случается проблема существования данных - некоторые из них делают cuments просто не имеют поля shortExcerpt.

Чтобы решить эту проблему, либо обеспечивать наличие этого поля с a package such as aldeed:collection2, сделать некоторые проверки достоверности данных самостоятельно ...
У вас также есть возможность принять его во внимание в шаблоне:

Template.singleExcerpt.helpers({ 
    shortExcerpt: function() { 
     var a = ''; 

     if(typeof this.text !== 'undefined') { 
      a = this.text.slice(0,120); 
     } 

     return a + '...'; 
    } 
}); 

Однако , Я бы посоветовал убедиться, что абсолютно все ваши документы имеют одинаковую структуру. В этом случае это будет означать, что shortExcerpt всегда должен быть определен, даже если он содержит только пустую строку.

0

использование RegisterHelper http://docs.meteor.com/#/full/template_registerhelper

Template.registerHelper('shortExcerpt', function(text, limit) { 
    return text.substring(0, limit) + (text.length > limit ? '...' : ''); 
}); 


Template.archive.helpers({ 
    itens: function() { 
     return Itens.find(); 
    }   
}); 

<template name="archive"> 
    {{# each itens }} 
     {{ shortExcerpt text 150}} 
    {{/each}} 
</template> 

использовать все шаблоны

{{ shortExcerpt 'Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit.' 80 }} 

--> "Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adi..." 
+0

Я проверю ваше предложение последним, @ yaşar-İÇlİ, поскольку он приносит хорошие подтверждения для показа или не «...», но я решил «неопределенный», используя 'if (this.text) {' just чтобы проверить, существует ли текст. Как, couse, мы не можем нарезать то, что не существует. –

0

Попробуйте что-то вроде этого:

Template.archive.helpers({ 
    shortExcerpt: function(text) { 

     if(text.length>120){ 
      var a = text.slice(0,120); 
      return a+'...'; 
     } 

     return text; 
    } 
}) 

<template name="archive"> 
    {{# each itens }} 
     {{ shortExcerpt text }} 
    {{/each}} 
</template> 
Смежные вопросы