响应/ JavaScript框架的氚功能设计

时间:2013-06-20 05:20:12

标签: zurb-foundation moovweb tritium

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

作为其中的一部分,我想创建辅助函数来启用基金会小部件,例如Moovweb中已有的Uranium integrations。但是像top bar这样的一些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")
      }
    }
  }
}

将这个抽象为可重复使用的氚函数的正确方法是什么,这些函数可以最大限度地减少样板并提供灵活性?

1 个答案:

答案 0 :(得分: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函数,可以选择用于定义顶部栏的右侧部分。

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

zurb_topbar_left <LI> zurb_topbar内容可能由程序员填充,因此产量。

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

  • 您必须同时使用zurb_topbar_titlezurb_topbar_left
  • 但只有zurb_topbar_rightzurb_topbar_left
  • 中的一个
  • zurb_topbar必须包含{{1}}
  • 等等。