2012-06-22 8 views
18

私はクライアントスクリプトの関数に渡す必要がある非常に大きなオブジェクトを持っています。私はJSON.stringifyを使用しようとしましたが、このアプローチではほとんどのパフォーマンスに関連するいくつかの問題が発生しました。 ejsでこれを行うことは可能ですか?ノード/ express + ejsのクライアントにオブジェクトを渡す?

app.get('/load', function(req, res) { 
    var data = { 
     layout:'interview/load', 
     locals: { 
      interview: '', 
      data: someLargeObj 
     } 
    }; 
    res.render('load', data); 
}); 

そして、私はこれをしようとするので、

<script type="text/javascript"> 
    load(<%- data %>); // load is a function in a client script 
</script> 

私はどちらか

<script type="text/javascript"> 
    load(); 
</script> 

または

<script type="text/javascript"> 
    load([Object object]); 
</script> 
を得るように私のクライアントスクリプトでは、私は関数にこのオブジェクトを渡します
+0

「JSON.stringify」が唯一の方法です。 –

答えて

8

これは予想される動作です。あなたのテンプレートエンジンはあなたのオブジェクトから[オブジェクトオブジェクト]につながる文字列を作成しようとしています。あなたが本当にそのようなデータを渡したいのであれば、オブジェクトを文字列化することによって正しいことをしたと思います。 Node.jsので

+1

'JSON.stringify(someLargeObj)' – alessioalex

48

:EJSで

res.render('mytemplate', {data: myobject});

<script type='text/javascript'> 
    var rows =<%-JSON.stringify(data)%> 
</script> 
+3

'<% - 'と '<%='の違いを教えてください。そしてなぜ最後の「;」もないのですか? – gr3g

+11

'<%= x %>'はxの値を直接補間し、 '<%-x%>'もHTML-エスケープするので、 '<' and '> 'のような文字はHTMLパーサーでは食べられません。 – prototype

+1

Javascriptのターミナルではセミコロンはオプションですが、含める方が良いでしょう。 – prototype

-1

はEJSにオブジェクトを渡すとき、あなたはJSONに対処するために持っていけない、もっと良い方法があると思います。 stringfyメソッドとJSON.parseメソッドは、少し難解で紛らわしいものです。代わりにあなたがたとえば、あなたのオブジェクトのキーを移動するループ内で使用することができます

あなたはEJS側では、このような階層

{ 
    "index": { 
     "url": "/", 
     "path_to_layout": "views/index.ejs", 
     "path_to_data": [ 
      "data/global.json", 
      { 
       "data/meta.json": "default" 
      } 
     ] 
    }, 
    "home": { 
     "url": "/home", 
     "path_to_layout": "views/home/index.ejs", 
     "path_to_data": [ 
      "data/global.json", 
      { 
       "data/meta.json": "home" 
      } 
     ] 
    }, 
    "about": { 
     "url": "/about", 
     "path_to_layout": "views/default.ejs", 
     "path_to_data": [ 
      "data/global.json", 
      { 
       "data/meta.json": "about" 
      } 
     ] 
    } 
} 

のような物を持っている場合することができます。このようなループyourObject。この例では

<% if (locals.yourObject) { %> 
    <% for(key in yourObject) { %> 
    <% if(yourObject.hasOwnProperty(key)) { %> 
     <div> <a class="pagelist" href="<%= yourObject[key]['subkey'] %>"><%= key %></a></div> 
    <% } %> 
    <% } %> 
<% } %> 

[キー]「インデックス」、「家」を取ることができ、「約」の値とサブキーはそれのいずれかが、このような「URL」、「path_to_layout」、「path_to_data」

として子供たちのことができます
1

テンプレートを使用している場合、テンプレートの値を取得するほうがはるかに良いでしょう(ユーザーがサインインされているかどうかなど)。

<script> 
    window.user = <%- JSON.stringify(user || null) %> 
</script> 

サーバー側のコードから、ユーザーデータを送信しています。

res.render('profile', { 
    user: user.loggedin, 
    title: "Title of page" 
}); 
関連する問題