2014-10-26 3 views
0

Я пытаюсь отобразить некоторые реляционные данные в шаблоне пространственных символов Meteor. В частности, я два сборника, Местоположение и Погода. Они выглядят примерно так:Можно ли переключить фокус коллекции в шаблонах пространственных символов Метеор?

Location { 
    _id: 'full-name', 
    title: 'Full name', 
    lat: '123.456', 
    long: '123.456', 
    order: 1 
} 

Weather { 
    locName: 'full-name', // this name always matches a location _id 
    temperature: '41.3' 
} 

я хотел бы, чтобы отобразить информацию из обоих этих коллекций на одной странице. Чтобы я мог показывать самую последнюю погоду из каждого места (их 4-20 на странице). Чтобы сделать это, я опубликовал запрос Монго из обеих коллекций, как так на стороне сервера:

Meteor.publish('allLocations', function() { 
    return [ 
     Locations.find({}, { sort: { order: 1 } }), 
     Weather.find({}) // The weather 
    ]  
}); 

Я тогда подписаться на эту публикацию в маршрутизаторе (железо-маршрутизатор):

Router.map(function() { 
    this.route('locations', { 
     waitOn: function() { 
      return Meteor.subscribe('allLocations'); 
     } 
    } 
}); 

Тем не менее, я застреваю, когда попадаю в мой шаблон. Я не могу понять синтаксис для переключения фокуса сбора в космос.

Вот psuedo-код для шаблона, который я пытаюсь разобрать, но я знаю, что это в настоящее время не работает.

<template name="locations"> 
    <div class="locations-grid"> 
    {{#each locations}} 
     <div class="location {{_id}}"> 
     This is the location template 
     <h1>{{title}}</h1> 
     {{#each weather}} 
      <!-- Trying to pass the _id along to the weather template for filtering --> 
      {{> weather _id}} 
     {{/each}} 
     </div> 
     {{/each}} 
    </div> 
</template> 

<template name="weather"> 
    This is the weather template 
    {{#with weather}} 
    <!-- Ideally, we've now switched contexts to the weather collection --> 
    <h2>Temperature: <div class="temp">{{temperature}}</div></h2> 
    {{/with}} 
</template> 

Так что я задаю вопрос, где я могу указать пробелы для переключения контекстов на погоду? Как передать переменную _id в шаблон погоды, чтобы я мог выбрать нужные данные из коллекции? Я знаю, что мне не хватает большого шага здесь, я просто не могу понять, какую часть пространства Метеор изучить. Я знаю, что мне может потребоваться указать подписку на шаблон погоды, но я не знаю, где это сделать, поскольку это не совсем маршрут, так как у него не будет собственной страницы. Он просто живет как подшаблон в шаблоне местоположений.

Спасибо за любые советы или возможные предложения по реструктуризации.

ответ

1

Прежде чем мы начнем, прочитайте A Guide to Meteor Templates & Data Contexts - это будет правильно ориентировать вас в контекстах внутри #each блоков.

Ваша цель - вставить правильные документы weather в соответствующие документы location. Это проще всего осуществить, введя подшаблоны для обоих типов. Давайте начнем с шаблона верхнего уровня:

<template name="locations"> 
    <div class="locations-grid"> 
    {{#each locations}} 
     {{> location}} 
    {{/each}} 
    </div> 
</template> 

который имеет locations помощника, как это:

Template.locations.helpers({ 
    locations: function() { 
    return Locations.find(); 
    } 
}); 

Далее location шаблона:

<template name="location"> 
    <div class="location"> 
    <h1>{{title}}</h1> 
    {{#each weathers}} 
     {{> weather}} 
    {{/each}} 
    </div> 
</template> 

Который имеет weather помощника, как это:

Template.location.helpers({ 
    weathers: function() { 
    return Weather.find({locName: this._id}); 
    } 
}); 

Ключевым понятием здесь является то, что контекст шаблона location является документом единого места, поэтому weather вернет только документы погоды для . Этот пример. И, наконец, ваш шаблон погода может выглядеть следующим образом:

<template name="weather"> 
    <h2>Temperature: {{temperature}}</h2> 
</template> 

Примечание мы теперь в weather контексте так #with больше не нужен.

Сторона примечания - использование сортировки в вашем издателе имеет no affect в этом случае.

+0

Спасибо. Это очень полезно. Я также прочитал связанный пост на Discover Meteor. Я все еще немного озадачен одним изменением. Для этого я могу только опубликовать коллекцию Location в шаблон местоположения. Как я могу указать шаблон местоположения, на который подписывается подписка? Я привык делать это в маршрутизаторе, но поскольку у этого местоположения нет маршрута, я не уверен, где * эта подписка будет идти. –

+0

Не похоже, что вам нужно что-то изменить. Подписки не относятся к шаблону - это запрос на то, чтобы сервер передавал данные в клиентскую базу данных (minimongo). Когда вы переходите к шаблону верхнего уровня, ваш маршрутизатор подписывается на 'allLocations', поэтому все данные о погоде и местоположении будут доступны для всех шаблонов. Имеет ли это смысл? –

+0

Когда я сохраняю и папку «Местоположение» и «Погода» в публикации allLocations, #each Weather возвращает «this» как объект Locations, но также включает записи Weather. –

Смежные вопросы