J'ai un scénario dans lequel j'essaie de créer un assistant de guidon personnalisé qui regarde la longueur d'un tableau et si plus de trois objets sont présents dans ce tableau, ne renvoyez que les trois premiers éléments, mais si ce n'est pas le cas, retournez le montant total. Voici ma tentative de faire exactement cela et je récupère la bonne quantité d'objets lorsque je passe une valeur pour limitAmount, mais les valeurs renvoyées sont [object SequelizeInstance:blog_comment] pour la quantité d'objets qui sont présent. Ce n'est pas ce que je recherchais et je me demande maintenant si une boucle for doit être impliquée pour renvoyer les valeurs des objets. Est-ce simplement résolu avec une boucle for?

Exemple détaillé de ce qui s'affiche:

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

Exemple de structure d'objet:

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

Guidon enregistré:

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

Utiliser dans un modèle:

{{#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
cphill 17 janv. 2017 à 02:08

2 réponses

Meilleure réponse

Solution 1. Oui. Vous devez utiliser for loop inside helper,

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;
})

Solution 2. Vous pouvez utiliser l'assistant each intégré pour itérer

{{#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 helper est le même que vous.

hbs.registerHelper('commentLimit', function(comment, limitAmount, options){
        if(comment.length > limitAmount){
            return comment.slice(0,limitAmount);
        } else {
            return comment;
        }
    })
1
Ember Freak 17 janv. 2017 à 13:46

Réponse affinée fournie par @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);
   }, '');
});

L'idée est de renvoyer la concaténation des résultats de chaque itération. La fonction «réduire» gère bien cette tâche.

Vous pouvez penser à l'appel d'options:

options.fn(comment)

Comme exécutant le bloc de code entre {{#commentLimit ...}} et {{/ commentLimit}} avec le contexte étant les valeurs fournies par le paramètre (dans ce cas, une des entrées dans blog_comments ').

0
rasmeister 17 janv. 2017 à 09:40