2017-01-16 2 views
1

У меня есть сценарий, в котором я пытаюсь создать специальный помощник handlebars, который смотрит на длину массива, и если в этом массиве присутствует более трех объектов, верните только первые три элемента, но если это не так, то верните полную сумму. Ниже была моя попытка сделать именно это, и я возвращаю нужное количество объектов, когда передаю значение для limitAmount, но возвращаемые значения: [object SequelizeInstance:blog_comment] для количества присутствующих объектов. Это не то, что я искал, и теперь мне интересно, нужно ли задействовать цикл for для возврата значений объектов. Это просто разрешено с помощью цикла for?Handlebars Array Length Условный помощник

Детальный пример того, что появляется:

[object SequelizeInstance:blog_comment],[object SequelizeInstance:blog_comment],[object SequelizeInstance:blog_comment] 

Объект Пример структуры:

blog_comments: [ 
{ 
commentId: 1, 
comment: 'Test', 
userId: 2}, 
{ 
commentId:2, 
comment: '2nd Test', 
userId: 1 
}] 

зарегистрированный Руль:

hbs.registerHelper('commentLimit', function(comment, limitAmount, options){ 
     if(comment.length > limitAmount){ 
      return comment.slice(0,limitAmount); 
     } else { 
      return comment; 
     } 
    }) 

Использование в шаблоне:

{{#commentLimit blog_comments 2}} 
     {{#ifeq userId @root.user.userId}} 
     <a href="#" class="comment-delete" data-comment-id="{{commentId}}">Delete</a></p> 
     {{/ifeq}} 
     <p class="blog-comment">{{comment}}</p> 
    {{/commentLimit}} 

ответ

1

Решение 1. Да. Вы должны использовать цикл внутри помощника,

hbs.registerHelper('commentLimit', function(comment, limitAmount, options) { 
    let res = comment; 
    if (comment.length > limitAmount) { 
     res = comment.slice(0, limitAmount); 
    } 
    let out =''; 
    for (var i = 0; i < res.length; i++) { 
     out = out + options.fn(res[i]); 
    } 
    return out; 
}) 

Решение 2. Вы можете использовать встроенный each помощник итерировать

{{#each (commentLimit blog_comments 2)}} 
     {{#ifeq userId @root.user.userId}} 
     <a href="#" class="comment-delete" data-comment-id="{{commentId}}">Delete</a></p> 
     {{/ifeq}} 
     <p class="blog-comment">{{comment}}</p> 
    {{/each}} 

commentLimit Хелпер же, как вы получили.

hbs.registerHelper('commentLimit', function(comment, limitAmount, options){ 
     if(comment.length > limitAmount){ 
      return comment.slice(0,limitAmount); 
     } else { 
      return comment; 
     } 
    }) 
+0

Благодарим вас за ответ. Очень полезно, но я нашел проблему с использованием вашего цикла выше. Когда я следую за вашими вспомогательными модификациями и использую просто '{{#commentLimit blog_comments 2}} {{/ commentLimit}}', я получаю правильный 2-х лимит записи, но он повторяется по одной и той же записи дважды, а не первые две записи. Когда я использую '{{#each (commentLimit blog_comments 2)}} {{/ each}}' I get 'options.fn не является функцией'. Когда я просто использую оператор if с '{{#each (commentLimit blog_comments 2)}}' Я получаю правильный вывод. Любая причина для проблем с двумя первыми попытками? – cphill

+0

О, извините. Для первого варианта Просто замените 'res [0]' на 'res [i]' в помощнике. А для второго решения достаточно вашего оригинального помощника – kumkanillam

0

Refining ответ предоставляется @kumkanillam:

Handlebars.registerHelper('commentLimit', function (comment, limitAmount, options){ 
    var commentList = comment.slice(0, limitAmount + 1); 
    return commentList.reduce(function(results, comment) { 
    return results + options.fn(comment); 
    }, ''); 
}); 

Идея заключается в том, чтобы вернуть конкатенацию результатов каждой итерации. Функция «уменьшить» отлично справляется с этой задачей.

Вы можете думать о Парам.вызовов:

options.fn(comment) 

как работает блок кода между {{#commentLimit ...}} и {{/ commentLimit}} с контекстом того значения предоставляемый параметром (в данном случае, одной из записей в блогах_комментариев).

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