2017-01-16 15 views
1

私は、配列の長さを調べるカスタムハンドルバーヘルパーを作成しようとしていますが、3つ以上のオブジェクトがその配列内に存在する場合は最初の3つの要素を返しますそうでない場合は、全額を返却してください。以下は私がこのようなことをしようとしたところで、limitAmountの値を渡すと適切な量のオブジェクトが戻ってきますが、返される値は存在するオブジェクトの量に対して[object SequelizeInstance:blog_comment]です。これは私が探していたものではありません、私は今forループがオブジェクトの値を返す必要があるかどうか疑問に思っています。これはforループで単純に解決されますか?ハンドルバーの配列長条件付きヘルパー

表示されているものの具体例:

[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ヘルパーはあなたが得たものと同じである反復処理するために使用できる必要があります。 @kumkanillamによって提供さ

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レコードの制限が得られますが、最初の2つのレコードではなく、同じレコードに対して2回繰り返します。 '{{#each(commentLimit blog_comments 2)}} {{/ each}}' 'options.fnは関数ではありません。 if文を '{{#each(commentLimit blog_comments 2)}}'と使うだけで、適切な出力が得られます。最初の2回の試行で問題が発生した理由は何ですか? – cphill

+0

申し訳ありません。最初のオプションは 'res [0]'をヘルパーの 'res [i]'に置き換えてください。そして、元のヘルパーで十分です2番目のソリューション – kumkanillam

0

精錬答え:

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

アイデアは、各反復の結果の連結を返すことです。 'reduce'関数はこのタスクをうまく処理します。あなたはオプションと考えることができ

は呼び出し:

options.fn(comment) 

{{#commentLimit ...}}との間のコードのブロックを実行しているとして、{{/ commentLimitは}}コンテキストに値でありますパラメータによって提供されます(この場合、blog_commentsのエントリの1つです)。

関連する問題