【问题标题】:Using javascript in Phoenix templates在 Phoenix 模板中使用 javascript
【发布时间】:2018-07-15 06:22:35
【问题描述】:

我想知道如何在我的 Phoenix 模板中使用 javascript 函数动态更新 phoenix 变量。

目前我有一个从我的控制器发送的列表,我正在使用一个 elixir for 循环来根据其中的内容呈现 html。我希望能够在输入框中输入内容并根据输入框中的内容过滤列表。

代码示例

<%= for word <- @words do %>
  <p><%= word %></p>
<% end %>

我希望能够基于js 函数动态过滤@words

有人知道如何实现吗?

提前致谢

【问题讨论】:

  • 看看这篇文章,我一直在使用 Dogbert 的提示作为最佳实践。不知道您当时是否需要它,但您知道需要将 Elixir JSON 编码包装在 raw 中,例如 var bob = &lt;%= raw Poison.encode!() %&gt;stackoverflow.com/questions/39052160/…
  • 也许,您可能只想从您的 js 中读取 @words,方法是将值设置为视图模板中的全局变量,或者将其设置为您的某些部分的 data-words 属性HTML 元素

标签: javascript html elixir phoenix-framework


【解决方案1】:

您可以采用几种不同的方法,主要取决于最初调用 JS 函数(在页面加载时)还是仅在以后根据用户操作调用。

方法一、在Phoenix模板中生成JS,让JS渲染列表。

<script>
  var wordList = [
    <%= for word <- @words do %>
      '<%= word %>',
    <% end %>
  ];
</script>

方法 2。正如@hisa_py 所说,用一个属性标记每个项目,以后可以选择和隐藏。

<%= for word <- @words do %>
  <p class='word-list' data-word='<%= word %>'><%= word %></p>
<% end %>

然后在 JS 中

function show(list) do
  var words = $('.word-list');
  for (var i = 0; i < words.length; i++) {
    if (list.indexOf($(words[i]).addr('data-word')) === -1) {
      $(words[i]).hide();
    } else {
      $(words[i]).show();
    }
  }
}  

【讨论】:

  • 感谢您的解决方案。它很有魅力。虽然这个解决方案对我有用,但我想知道是否还有办法更新实际的 elixir 变量?一般来说,使用 JS 更新 elixir 变量会很有帮助。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 2017-04-25
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
相关资源
最近更新 更多