2

我正在玩Volt,目前正在尝试在我的 Volt 应用程序中为侧边栏做一个简单的 toggleClass(没有运气)。这是一个代码示例。

应用程序/main/views/main.html

<:Title>
  {{ view main_path, "title", {controller_group: 'main'} }}

<:Body>

  <div id="wrapper">
    <div id="sidebar-wrapper">
      <ul class="sidebar-nav">
        <li><a href="#">blah</a></li>
        <li><a href="#">blah</a></li>
        <li><a href="#">blah</a></li>
        ...
      </ul>
    </div>

    <div id="page-content-wrapper">
      <div class="container-fluid">
        <div class="btn btn-default sidebar-toggler">Toggle Sidebar</div>
        <:volt:notices />
        {{ view main_path, 'body', {controller_group: 'main'} }}
      </div>
    </div>
  </div>

应用程序/main/assets/js/sidebar.js

$(document).ready(function() {
  $(".sidebar-toggler").click(function(e) {
    e.preventDefault();
    $("#wrapper").toggleClass("toggled");
  });
});

当点击div.sidebar-toggler一个toggled类时应该添加到div#wrapper......它没有,也许有另一种方法可以用 Volt 做到这一点。

上面的代码不起作用。什么是好的伏特方式来做到这一点?

4

1 回答 1

2

在伏特中,您通常会将切换状态设置为控制器上的“反应式访问器”,然后使用绑定来更新类状态。由于控制器是绑定的上下文,我们可以在 if 绑定中检查 reactive_accessor 的状态。

在控制器中:

module Main
  class MainController < Volt::ModelController
    reactive_accessor :toggled

    def toggle_sidebar
      self.toggled = !toggled
    end
    ....

在视图中:

...
<div class="btn btn-default sidebar-toggler {{ if toggled }}toggled{{ end }}" e-click="toggle_sidebar">Toggle Sidebar</div>
...

当我们调用 self.toggled = 方法时,它会更改状态并使用该数据响应性地更新任何绑定。e-click 调用控制器上的 toggle_sidebar 方法。做这样简单的事情的常见 Volt 方法是将if直接放入视图中。我们还可以将它放入一个返回字符串并绑定到该字符串的方法中。

def toggled_class
  toggled ? 'toggled' : ''
end

....

<div class="btn btn-default sidebar-toggler {{ toggled_class }}" e-click="toggle_sidebar">Toggle Sidebar</div>

希望这会有所帮助,如果您需要,我可以澄清更多。

于 2015-06-14T19:46:42.933 回答