3

我正在使用 Moovweb/Tritium 使用 Zurb Foundation 框架使常规桌面站点具有响应性。

作为其中的一部分,我想创建辅助函数来启用 Foundation 小部件,例如Moovweb 中已有的Uranium 集成。但是某些 Foundation 组件,例如顶部栏具有复杂的布局,需要比单个函数调用中看起来合理的更多配置。

例如,启用顶栏需要类似以下结构:

# Use the foundation topbar
insert_top("nav", class: "top-bar") {

  # Create the title area
  insert("ul", class: "title-area") {
    inject("<li class='name'><h1><a href='/'>Website Name</a></h1></li>")
    inject("<li class='toggle-topbar menu-icon'><a href='#'><span>Menu</span></a></li>")
  }

  # Grab the header links and put them in the top bar
  insert("section", class: "top-bar-section") {
    insert("ul", class: "left") {

      # Move the original header links here
      move_here("//span[@class='pagetop']//a"){
        wrap("li")
      }
    }
  }
}

将其抽象为可重用的氚函数的正确方法是什么,以最大限度地减少样板代码但又允许灵活性?

4

1 回答 1

3

在我的用例中,我通过将布局分解为相互嵌套的相关函数来处理这个问题。所以上面的原始代码变成了:

# enable the foundation top bar
zurb_topbar() {    
  zurb_topbar_title("Website Name", "Menu", "menu-icon")
  zurb_topbar_left() {
    move_here("//span[@class='pagetop']//a"){
      wrap("li")
    }        
  }
}

其中函数定义为:

@func XMLNode.zurb_topbar() {   
    insert_top("nav", class: "top-bar") {
      yield()
    }
}

@func XMLNode.zurb_topbar_title(Text %name, Text %menu_btn_name, Text %menu_icon) {
    insert("ul", class: "title-area") {
      inject("<li class='name'><h1><a href='/'>" +%name +"</a></h1></li>")
      inject("<li class='toggle-topbar "+%menu_icon+"'><a href='#'><span>"+%menu_btn_name+"</span></a></li>")
    }
}

@func XMLNode.zurb_topbar_left() {
  insert("section", class: "top-bar-section") {
    insert("ul", class: "left") {
     yield()
    }
  }
}

您可以想象一个zurb_topbar_right函数可以选择性地用于定义顶部栏的右侧部分。

请注意, szurb_topbar_title的 href 和结构<LI>是硬编码的,因为您通常不太可能希望将 href 指向除根以外的任何地方。相反,您可能想要自定义的部分是顶部栏的标题、菜单按钮的标题以及菜单栏图标的存在。

而对于zurb_topbar_left内容<LI>可能会由程序员填写,因此产量。

权衡似乎是自动强制以正确的方式使用正确的功能组合变得更加棘手,即

  • 你必须同时使用zurb_topbarzurb_topbar_title
  • 但只有一个zurb_topbar_leftzurb_topbar_right
  • zurb_topbar 必须包括zurb_topbar_left
  • 等等等等
于 2013-06-20T05:20:11.683 回答