2013-03-03 4 views
1

У меня есть идея подачи новостей. Я пытаюсь в Метеор, но у меня проблемы с тем, что чертовски ведут себя :) I хотите, чтобы он загружал ленту новостей на загрузку/обновление страницы, но не при изменении данных. Я нашел в документации, что добавление {reactive: false} к методу поиска коллекции должно заставить его придерживаться результатов, полученных при рендеринге, но для меня это не работает. Метеор сразу же обновляет шаблон.Установка {реактивная: ложная} при поиске коллекции в Метеор все еще обновляет шаблон

Вот код, который я получил:

На стороне сервера:

Meteor.publish("newsfeed", function() { 
    return Newsfeed.find({}); 
}); 

На стороне клиента:

Meteor.subscribe('newsfeed'); 

Template.feed.feed_data = function() { 
    var feed = Newsfeed.find({}, { 
     sort: {updated_time: -1}, 
     limit: 10, 
     reactive: false 
    }); 

    return feed; 
}; 

В шаблоне:

<template name="feed"> 
    <div id="feed-wrapper"> 
     <ul> 
      {{#each feed_data}} 
       <li> 
        <div class="message">{{message}}</div> 
       </li> 
      {{/each}} 
     </ul> 
    </div> 
</template> 

Если я запустил Newsfeed.update({_id: 'some_random_id'}, {$set: {date_created: 'some_random_date'}}) в Dev Tools, шаблон обновит сортировку моей ленты новостей и изменяет ее.

Как я могу сделать это не так? : D

+0

На боковой ноте; Я попытался удалить все функции автозапуска, которые у меня были в проекте, подумав, что это может быть связано с обновлением другой коллекции одновременно и что каким-то образом запускает визуализацию шаблона, но это ничего не меняет. –

ответ

3

Это, возможно, ошибка в Метеор. Передача reactive: false означает, что minimongo сам не настроил какой-то код, чтобы сказать «наблюдать, а если он изменяет, invalidate». Но у #each есть свой отдельный вызов наблюдения, который использует обратные вызовы наблюдения напрямую (не реактивный «invalidate and realculate») для обновления списка. Вероятно, мы не должны этого делать, если на нем есть reactive: false. Отслеживайте это в https://github.com/meteor/meteor/issues/771!

0

Это немного странно, оно должно работать. Вы можете также использовать preserve:

Попробуйте добавить эту строку в ваш клиент JS

Template.feed.preserve(['#feed-wrapper']); 

Btw находится в другом шаблоне template name="feed"? Имеет ли в этом шаблоне какие-либо реактивные переменные?

+0

Пробовал добавить сохранение, что не сработало. Шаблон в комплекте изнутри другой шаблон. Я попытался удалить его из родительского шаблона и просто добавить его сразу после , но все же, если я изменил коллекцию, он был повторно отображен на стороне клиента. –

+0

Я смог дублировать это, это может быть ошибка, и я открыл проблему с репутацией github meteor, описывающей ее. – Akshat

+0

Спасибо Akshat - если кто-нибудь найдет это, вот в чем проблема: https://github.com/meteor/meteor/issues/771 –