2016-08-24 8 views
0

現在のurlクエリ文字列を吐き出すハンドルバーヘルパーを作成しようとしています。次に、そのクエリ文字列を使用してテンプレートを設定します。私はhtmlファイル生成を行うためにアセンブルを使用しています。現在のURLクエリ文字列を取得

私のURLは次のようになります:groups/group-details/?id=1と私はid値を取得したいと思います。ここで

は私のヘルパーです:

Handlebars.registerHelper('currentId', function() { 
    return document.location.search.split('?')[1].split('=')[1]; 
}); 

そして、私は私の.hbsでそれを呼び出していますが、このようにテンプレート:

{{currentId}} 

私はそれだけで、この例では1を吐き出すことを期待していないが、何もしています示されています。

どこが間違っていますか?

- 編集 -

ウェブインスペクタコンソールで周り掘りは私のヘルパーが登録されているが、私はreturn文にブレークポイントを置けば、それはヒットれることは決してありません示しています。私はヘルパーがちょうど '実行されていないと仮定します。

答えて

2

アセンブラでhtmlを作成する場合は、アセンブルする際にハンドルバーを使用してレンダリングパスを実行します。このレンダーパスは、サーバー上の{{currentId}}テンプレートを解決しようとします。

これが実行されている場合、document.location.searchは利用できないため、ヘルパー内でエラーが発生することが予想されます。あなたがそこでエラーを取得していないので、私はヘルパーが組み立てに登録されておらず、Handlebarsのフロントエンドのインスタンスでのみ登録されていると仮定しています。 assembleで登録されていない場合、{{currentId}}はHandlebarsによって値として解釈され、何も描画されません。

TL; DR;

フロントエンドテンプレートとバックエンドテンプレートを混在させる場合、フロントエンドテンプレートをエスケープして、バックエンドプロセスがそれらをレンダリングしないようにする必要があります。ヘルパーが使用されているかどうかを調べるには、\{{currentId}}を試してみてください。

+0

あなたは何を言っているのですか。 '\ {{currentId}}'を入れるだけで、生成されたhtmlに '{{currentId}}'が出力されます。 – boz

+0

ブラウザにテンプレートをレンダリングしていますか?もしそうでなければ、 'document'がサーバー上で利用可能になるとは思わないので、その時点ではクエリ文字列はありません。 – doowb

+0

私はそうではありません。クエリ文字列についてあなたが言っていることは、理にかなっています。私は自分のアプローチを変えて、そのページセットのテンプレートをブラウザでレンダリングする必要があります。 – boz

1

あなたが間違っている理由はわかりません。

しかし、ここでは正規表現を使用します。 groups/group-details/?id=1

var a = (new RegExp('/?id=(\d)+')); 
var v = a.exec('groups/group-details/?id=1')[1]; 
console.log(v); 

のうち、1を解析するための

はまた、私は

"groups/group-details/?id=1".split('?')[1].split('=')[1]

を試し、それが1罰金を返します。

私が正規表現に行く理由は、あなたがすでに最も効率的な方法ではないかもしれない2つの文字列操作をしているということです。

関連する問題