2014-07-13 260 views
5

我有一個一對多的關係的兩個流星集合:建築物和公共場所流星鐵路由器嵌套路線

在我的建築頁,我想表明有關建築物的空間。

現在,我就是這麼做的:

buildingsRoute.coffee 
    BuildingController = RouteController.extend(template: "buildings") 
    Router.map -> 
     @route "building", 
     path: "/buildings/:_id" 
     waitOn: -> 
      subs.subscribe "allBuildings" 
      subs.subscribe "allSpaces" 

     data: -> 
      building: Buildings.findOne(@params._id) 
      spaces: Spaces.find({building_id: @params._id}) 

building.jade:

template(name="building") 
     +with building 
      .building 
       .page-header.position-relative 
        h1.inline #{name} 
       .row 
        .col-xs-12 
         +spacesList 

template(name="spacesList") 
    .widgets 
     .row 
      h1 Spaces 
      +each spaces 
       .col-xs-12.col-sm-6 
        .widget-box.widget-color-purple 
         .widget-header 
          a(href="{{pathFor 'space'}}") #{name} 
         .widget-body 
          p Content here 

這並不爲這樣的工作,我猜是因爲spacesList模板的數據上下文與鐵路路由器爲建築定義的不一樣。

我可以用「+ each ../spaces」替換「+ each spaces」,但這對我來說似乎不是一個非常通用的解決方案(如果我想在另一個上下文中使用我的spaceslist模板,該怎麼辦?)

於是,我就這樣定義模板傭工的數據上下文:

Template.spacesList.helpers 
    spaces: Spaces.find({building_id: @params._id}) 

但我得到的錯誤信息:

Spaces is not defined. 

所以我有點糊塗了。什麼是流星的方式來正確實施嵌套路線?

謝謝!

編輯:

空間集合的定義:/models/space.coffee

@Spaces = new Meteor.Collection("spaces", 
    schema: 
    building_id: 
     type: String 
     label: "building_id" 
     max: 50 

    name: 
     type: String 
     label: "Name" 
     optional: true 
     max: 50 

    creation_date: 
     type: Date 
     label: "Creation date" 
     defaultValue: new Date() 
) 

出版物:/server/publications.coffee

# Buildings 

    Meteor.publish "allBuildings", -> 
     Buildings.find() 

    Meteor.publish "todayBuildings", -> 
     Buildings.find creation_date: 
     $gte: moment().startOf("day").toDate() 
     $lt: moment().add("days", 1).toDate() 



    # Publish a single item 
    Meteor.publish "singleBuilding", (id) -> 
     Buildings.find id 


    # Spaces 
    # Publish all items 
    Meteor.publish "allSpaces", -> 
     Spaces.find() 

EDIT 2

後一些研究,我終於想出了一個解決方案:

Template.spacesList.helpers 
    spaces:() -> 
    if Router._currentController.params._id 
     subs.subscribe "buildingSpaces", Router._currentController.params._id 
     Spaces.find() 
    else 
     subs.subscribe "allBuildings" 
     Spaces.find() 
    nbr_spaces:() -> 
    Spaces.find().count() 

有了一個額外的刊物:

# Publish all items for building 
Meteor.publish "buildingSpaces", (building_id) -> 
    Spaces.find({building_id: building_id}) 

的錯誤是:

  • 一個事實,即空間的定義並沒有裹成一個功能
  • 的@ params._id那我取而代之的不是很性感的Router._currentController.params._id,但我找不到任何快捷方式。

我仍然不知道這是否是流星(最好)的方式來管理嵌套的路線......

任何更好的建議?

+0

請註明'Spaces'收集的定義和文件路徑(如:'/ lib目錄/收藏/ spaces.coffee') 。另請注意,翡翠中的'+'用於嵌套模板和自定義組件。你應該從'each',''等''中刪除它們,我甚至感到驚訝,即使編譯。 –

+1

我將它們添加到我的文章的末尾。關於每一個,如果等等,它們實際上是組件。即使它是可選的(https://github.com/mquandalle/meteor-jade/),它們也應該與+一起使用。這就是編譯的原因。 – ndemoreau

+0

啊,是的,你對+的完全正確,我想我只是略過了那部分文檔。 –

回答

8

經歷了很多不同的選擇後,我終於找到了一個鐵路路由器的選項,我沒有注意過。這使得魔法。

嵌套路由(至少有兩個層次(我沒有嘗試更多級別))的實現變得與使用收益率要容易得多:

我的路線是這樣的一個:

Router.map -> 
    @route "buildingSpaces", 
    path: "/buildings/:_id/spaces" 
    template: "building" 
    yieldTemplates: { 
     'buildingSpaces': {to: "subTemplate"} 
    } 
    waitOn: -> 
     [subs.subscribe("allSpaces"), 
     subs.subscribe "allBuildings"] 

    data: -> 
     building: Buildings.findOne(@params._id) 
     spaces: Spaces.find({building_id: @params._id}) 

這是我的模板:

template(name="building") 
    .animated.fadeIn 
     +with building 
       .building 
        .page-header.position-relative 
         h1.inline #{name} 
        .row 
         .col-xs-12 
          .tabbable 
           ul.nav.nav-tabs 
            li#menu-spaces(class="{{isActive 'buildingSpaces'}}") 
             a(href="{{pathFor 'buildingSpaces'}}") #{nbr_spaces} Spaces 
            li#menu-dashboards(class="{{isActive 'buildingDashboards'}}") 
             a(href="{{pathFor 'buildingDashboards'}}") Dashboards 
           .tab-content 
            +yield "subTemplate" 


template(name="buildingSpaces") 
    .animated.fadeInDown 
     .page-header.position-relative 
      a.btn.btn-info.btn-sm#newSpaceButton 
       i.ace-icon.fa.fa-plus 
       | New space 
     .clearfix 
     +spacesList 

template(name="spacesList") 
    .widgets 
     .row 
      +each spaces 
       .col-xs-12.col-sm-6 
        .widget-box.widget-color-purple 
         .widget-header 
          a(href="{{pathFor 'space'}}") #{name} 
         .widget-body 
          p Content here 
    +insertSpaceForm 

最後,我有一個助手來管理我的菜單:

Handlebars.registerHelper "isActive", (template) -> 
    currentRoute = Router.current().route.name 
    if currentRoute and template is currentRoute then "active" 
    else "" 

這很光滑。單擊子菜單時,它只加載子模板。這是我找到了最好的...

希望這有助於...

+0

有趣,感謝分享! –