Новая Идея
// client side collection, not synchronized with server side...
DataListWithAds= new Mongo.Collection(null);
Template.DataList.destroyed= function(){
this.observer.stop();
}
Template.DataList.created= function(){
// DataList is collection anywhere
// get handler of observer to remove it later...
this.observer = DataList.find().observe({
// observe if any new document is added
// READ : http://docs.meteor.com/#/full/observe
addedAt:function(document, atIndex, before){
console.log(atIndex, document, self);
// immediately insert original document to DataListWithAds collection
DataListWithAds.insert(document);
// if some condition is true, then add ad.
if(atIndex % 5 == 1){
DataListWithAds.insert({
name:"AD", score:document.score, isAd:true
});
}
}
})
}
// use local collection to display items together with ads
Template.dataList.helpers({
dataList : function() {
return DataListWithAds.find();
});
})
Также шаблон должен быть изменен немного:
<template name="dataList">
{{#each dataList}}
{{#if isAd}}
ADVERTISEMENT
{{else}}
<div class="col-xs-3">
{{name}} (and other data)
</div>
{{/if}}
{{/each}}
</template>
Доказательство концепции можно найти здесь: http://meteorpad.com/pad/SoJe9dgp644HKQ7TE/Leaderboard
Я думаю, что есть еще вещи решите, например: - Как это сделать вместе с сортировкой?
Старый Идея
Ниже приводится идея как можно достичь желаемого результата.
Подход заключается в том, что клиентская сторона ждет, пока ваш список не будет рендеринга (происходит только один раз), а затем вводит объявление в выбранное вами положение.
Предположения:
- Ваше объявление определено в шаблоне adsTemplate
- элементы находятся в DIV: #listContainer
Код:
Template.dataList.rendered = function(){
// position after which ads should be added
// you can generate random number
var adsPosition = 10;
// inject HTML from template **Template.adsTemplate**
// with data **adsData**
// to HTML element #listContainer
// after HTML element at position adsPosition
Blaze.renderWithData(
Template.adsTemplate,
adsData,
this.find('#listContainer'),
this.find('#listContainer .col-xs-3:nth-child('+adsPosition+')')
)
}
Если вы хотите добавить много объявлений, потому что список должен быть бесконечным, тогда полезно использовать Tracker.autorun для обнаружения новых данных и инъекции соответственно.
Вы запустили это в дикой природе?Я бы ожидал, что шаблон «dataList» будет отображаться до того, как будут обработаны все документы в каждом цикле ('# listContainer'). Это приводит к мерцанию? – user728291
Я не упоминал, что это было на бесконечном свитке. Это решение не будет вставлять объявление несколько раз – Chris
Мне нравится этот метод лучший, однако я до сих пор не могу его постоянно отображать. Он кратко показывает adsTemplate, а затем, когда данные загружены, вы больше не можете их видеть – Chris