2017-01-16 3 views
1

Ich habe ein Szenario, wo ich versuche, einen benutzerdefinierten Lenker Helper, der die Länge eines Arrays und wenn mehr als drei Objekte in diesem Array vorhanden sind, nur die ersten drei Elemente, aber Wenn dies nicht der Fall ist, geben Sie den vollen Betrag zurück. Unten war mein Versuch, genau das zu tun und ich bekomme die richtige Menge an Objekten zurück, wenn ich einen Wert für limitAmount übergebe, aber die Werte, die zurückgegeben werden, sind für die Anzahl der Objekte, die vorhanden sind. Dies ist nicht was ich gesucht habe und ich frage mich jetzt, ob eine For-Schleife beteiligt sein sollte, um die Werte der Objekte zurück zu geben. Wird das einfach mit einer for-Schleife gelöst?Lenker Array Länge Conditional Helfer

Detaillierte Beispiel von dem, was erscheint:

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

Objektstruktur Beispiel:

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

Registrierte Lenker:

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

Verwendung in Vorlage:

{{#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}} 

Antwort

1

Lösung 1. Ja. Sie müssen sich für Schleife innerhalb Helfer verwenden,

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

Lösung 2. Sie können mit Einbau-each Helfer

{{#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 Helfer gleiche iterieren wie Sie.

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

danke für Ihre Antwort. Sehr hilfreich, aber ich habe ein Problem mit der Verwendung der obigen Schleife gefunden. Wenn ich Ihren Hilfsmodifikationen folge und nur '{{#commentLimit blog_comments 2}} {{/ commentLimit}}' verwende, erhalte ich die korrekte 2-Eintragsgrenze, aber es wiederholt sich zweimal über denselben Eintrag, anstatt die ersten zwei Einträge. Wenn ich '{{#each (commentLimit blog_comments 2)}} {{/ each}}' 'hole, ist' options.fn keine Funktion'. Wenn ich nur die if-Anweisung mit '{{#each (commentLimit blog_comments 2)}}} verwende, bekomme ich die korrekte Ausgabe. Irgendein Grund für die Probleme mit den ersten beiden Versuchen? – cphill

+0

Oh Entschuldigung. Für die erste Option Ersetzen Sie einfach res [0] 'mit' res [i] 'in helper. Und für die zweite Lösung reicht Ihr ursprünglicher Helfer aus – kumkanillam

0

Refining Antwort von @kumkanillam zur Verfügung gestellt:

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

Die Idee ist die Verkettung der Ergebnisse jeder Iteration zurückzukehren. Die 'reduce' Funktion erledigt diese Aufgabe gut.

Sie die Optionen denken nennen:

options.fn(comment) 

als den Codeblock zwischen dem Lauf {{#commentLimit ...}} und die {{/ commentLimit}} mit dem Kontext sind die Werte wird durch den Parameter geliefert (in diesem Fall einen der Einträge in blog_comments).

Verwandte Themen