как динамически заполнять структуру данных javascript

#ruby-on-rails-3

#ruby-on-rails-3

Вопрос:

когда пользователь нажимает на ссылку «Мой дисплей», он переходит на страницу «Мой дисплей», после загрузки страницы запускается javascript для отображения. что-то вроде приведенного ниже:
...
display_data_hash = {}

function display() {
// use display_data_hash here
}
...

возможно ли заполнить «display_data_hash» в моем javascript на стороне сервера? или я должен просто добавить тег в свое представление и заполнить display_data_hash внутри моего html. я действительно не хочу смешивать javascript с html.

Ответ №1:

Первый подход с использованием AJAX

вы могли бы получить свой display_data_hash с помощью AJAX (jQuery здесь), например:

 $.getJSON('/yourcontroller/youraction.json', function(data) {

   display(data);

});
  

и в вашем контроллере вы выводите ответ json, подобный:

 class YourController < ApplicationController
   def your_display_action

      @my_data = .....

      respond_to do |format|
        format.json{ render :json => @my_data }
      end
   end
end
  

Второй подход без AJAX

Если вы не хотите запускать AJAX-запрос, вы могли бы сделать что-то вроде:

В вашем представлении макета добавьте раздел:

 <html>
<head>
....
<script type="text/javascript">
    <%= yield :inline_js %>
</script>
....
</head>
<body>
....
</body>
</html>
  

затем создайте вспомогательный метод, подобный:

 def insert_display_data(display_data) {

  # convert hash to json
  data_json = display_data.to_json

  content_for :inline_js do
     "display('#{data_json}');"
  end
}
  

и в вашей функции отображения JavaScript выполните:

 function display(data) {

  if(data instanceof String) { 
     // parse JSON using jquery
     data = $.parseJSON(data);
  }

  // your code...
}
  

Комментарии:

1. спасибо sled. зачем мне нужно выполнять вызов AJAX? когда я вызываю свой контроллер отображения, он должен возвращать html и javascript, я просто хочу, чтобы сервер заполнил мой display_data_hash в моем javascript.

2. привет, тогда перейдите ко второму решению, используя content_for и вспомогательную функцию 🙂

3. спасибо за код, он полезен. я предполагаю, что нет способа динамически обновлять javascript без участия html, единственное решение — изменить содержимое тега <script> в html.

4. это совершенно нормально, если вы делаете это чистым способом. Проблема в том, что синтаксис хэша ruby и хэша javascript отличается. Поэтому вы можете передать свой хэш в виде json и проанализировать его в своей JS-функции в хэш javascript. Вы должны поместить хэш ваших данных куда-нибудь в свой html-код, иначе он не дойдет до клиента 🙂