javascript var node.js доступен в целевом файле res.render () - PullRequest
1 голос
/ 13 июня 2011

Я пытаюсь сделать переменную (в конце концов, замененную более сложным json, выбранным из базы данных) доступной для клиентского JavaScript.Я хотел загрузить его, когда страница отображается вместо вызова ajax, и она не будет отображаться с помощью шаблона, такого как ejs (я хочу передать данные в хранилище extjs для выпадающего списка).Итак, у меня есть стандартный ответ, который я отображаю:

function (req, res) {
  res.render('index.html', {foo: ['a','b']});
}

и пустая HTML-страница, к которой я хочу получить доступ foo:

<!DOCTYPE html>
<html>
<head>
<script type=text/javascript>
console.log(foo);
</script>
</head>
<body>
</body>
</html>

Есть идеи?Я подумал, может быть, написать всю HTML-страницу с помощью res.send () (в которой есть несколько вещей, чем в примере выше), но это похоже на обходной путь для чего-то, что должно быть очевидно сделать ...

Ответы [ 2 ]

1 голос
/ 13 июня 2011

Предполагая тот же массив foo в вашем вопросе выше, вот несколько способов сделать это.

Этот использует фильтр EJS для записи литерала массива:

<script type="text/javascript">
var foo = ['<%=: foo | join:"', '" %>'];
</script>

Этот код кодирует его как JSON, чтобы впоследствии он был проанализирован вашим клиентским JavaScript:

<script type="text/javascript">
// note the "-" instead of "=" on the opening tag; it avoids escaping HTML entities
var fooJSON = '<%-JSON.stringify(foo)%>';
</script>

IIRC, ExtJS может обрабатывать JSON напрямую как свои данные. Если нет, то вы можете сначала использовать его анализатор JSON, а затем передать его локальной переменной. Если вы не использовали ExtJS, вы можете использовать это для разбора на клиенте: https://github.com/douglascrockford/JSON-js

Если вы решите закодировать его как JSON, это также облегчит последующее переключение обратно на AJAX для получения ваших данных. В некоторых случаях это имело бы преимущество. Страница может загрузить и отобразить некоторые данные, а также значок «занят» над элементом, для которого вы загружаете данные.

Это не значит, что с включением всех данных в исходный запрос что-то не так. Просто придерживаться JSON дает вам возможность выбирать позже.

1 голос
/ 13 июня 2011

В EJS должно работать следующее

<script type=text/javascript>
  console.log( <%= foo %>);
</script>

Я не рекомендую динамически генерировать JavaScript, хотя это нарушает разделение проблем и заставляет JavaScript работать.

Редактировать:

Оказывается, что вышеприведенное не очень хорошо работает для массивов.Так что просто закодируйте свои данные в семантическом HTML.Затем улучшите с помощью JavaScript.Если JavaScript должен получать данные, то храните их где-то более разумно, например, cookie, или извлекайте их через ajax.

...