Как запустить какой-то код только один раз в поле зрения - PullRequest
1 голос
/ 14 июня 2010

У меня есть частичное представление, называемое _comment.erb, и оно может вызываться родителем много раз (например, в цикле). _Comment.erb выглядит так:

<script>
function aaa() {}
</script>

<%= comment.content %>
<%=link_to_function 'Do', 'aaa()' %>

Вы можете видеть, что если _comment.erb вызывается много раз, функция javascript 'aaa' будет переопределяться много раз Я надеюсь, что это может быть определено только один раз, но я не хочу перемещать его в родительское представление.

Я надеюсь, что есть метод, скажем 'run_once', и я могу использовать его следующим образом:

<%= run_once do %>
  <script>
  function aaa() {}
  </script>
<% end %>

<%= comment.content %>
<%=link_to_function 'Do', 'aaa()' %>

Независимо от того, сколько раз я вызываю _comment.erb, код внутри run_once будет запускаться только один раз. Что мне делать?

Ответы [ 6 ]

3 голосов
/ 14 июня 2010

Вероятно, это не лучшее решение вашей проблемы, но создание помощника, который даст только один раз, - не слишком большая проблема:

Helper

def output_once(name, &block)
    @output_once_blocks ||= []
    unless @output_once_blocks.include?(name)
        @output_once_blocks << name
        concat(capture(block), block.binding)
    end
end

Использование

<% output_once :define_aaa do %>
    Your stuff here
<% end %>
3 голосов
/ 14 июня 2010
<% if !@once_flag && @once_flag=1 %>
  <script>
  function aaa() {}
  </script>
<% end %>
0 голосов
/ 15 июня 2010

Насколько я знаю, нет такой функции, как "run_once", поэтому вы должны либо написать ее самостоятельно, либо обработать свой код другим способом. Для javascript просто определите его в файле application.js, и затем вы сможете вызывать его, когда захотите. Если это код ruby, то поместите его в помощники вашего приложения, а для HTML он действительно должен быть частичным.

0 голосов
/ 14 июня 2010

Хм, если вы хотите определить материал один раз, вы можете просто определить другой пакет.

Определить JavaScript и визуализировать _comment.erb частично здесь.Это должно решить обе проблемы.

0 голосов
/ 14 июня 2010

Попробуйте что-то вроде этого

В вашем макете создайте скрытое текстовое поле с именем 'flag' и установите для него значение по умолчанию 0

(убедитесь, что вы не включили это в свою часть)

в вашем частичном сценарии

проверьте это значение и, если оно есть! = 1, выполните вашу функцию

Это не твердое решение, но, поскольку вашей логике нужен какой-то флаг для отслеживания количества выполнений, это будет обходной путь

веселит, Самера

0 голосов
/ 14 июня 2010

Тест, чтобы увидеть, была ли функция уже определена.Если нет, определите / запустите его

   <script type="text/javascript">
   /*<![CDATA[*/
      if (!aaa) {
        function aaa() {}
      }
   /*]]>*/
    </script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...