0

この方法でhtmlをロードすることにより、underscore.templateを使用してJavaScriptテンプレートをコンパイルしようとしています jQuery.get:

_.template($.get('my_template.html'), $get(function(data) { 
    return data;
}));

しかし、次のメッセージが表示されます

TypeError: Object #<Object> has no method 'replace'

ヒントはありますか?

4

1 に答える 1

3

$.getあなたが思うようには機能しません。$.get('my_template.html')を返さずmy_template.html、 を返します。取得しているものはコールバックjqXHRに渡されます。$.get

$.get('my_template.html', function(html) {
    // my_template.html will be in `html` here.
});

そのため、本当に を使用$.getしてテンプレートを取得したい場合は、AJAX 呼び出しがサーバーから何かを返すのを待つ必要があります。async次のオプションを使用して、同期 AJAX リクエストを作成できます$.ajax

async (デフォルト: true)
タイプ: ブール
デフォルトでは、すべてのリクエストは非同期に送信されます (つまり、これはtrueデフォルトで に設定されています)。同期リクエストが必要な場合は、このオプションを false に設定します。[...] 同期リクエストはブラウザを一時的にロックし、リクエストがアクティブな間はすべてのアクションを無効にする場合があることに注意してください。

それは次のようになります。

var tmpl;
$.ajax({
    url: 'my_template.html',
    type: 'get',
    async: false,
    success: function(html) {
        tmpl = html;
    }
});
var t = _.template(tmpl);
// `t` is now your compiled template function

これはお勧めしませんが、これasync:falseはユーザーにとって厄介なことであり、使用するとアプリケーションがロックアップまたはクラッシュしたと思われる可能性があります。

テンプレートをロードする別の方法を見つけます。それらをすべて<script>要素に入れて、いつでも利用できるようにするか、JavaScript が使用するものと一緒に配信します。

于 2013-10-19T19:27:05.230 に答える