2

Я заметил, что когда я изменяю опубликованный курсор - НЕ данные, на которые указывает курсор, но весь курсор - Meteor отправит клиенту сообщение removed все документы, которые не отображаются в новом курсоре. Что я имею в виду более технических терминах:Предотвращение удаления Meteor от данных MiniMongo, уже отправленных клиенту при публикации изменений

// client side 
Tracker.autorun(function() { 
    var someReactiveVar = someReactiveVar.get(); 
    Meteor.subscribe('myPublication', someReactiveVar); 
} 
... 
// server side 
Meteor.publish('myPublication', function() { 
    var someParameter = arguments[0]; 
    return myCollection.find({ someAttribute: someParameter }); 
}); 

Теперь, когда someReactiveVar изменения, все документы, которые были отправлены на стороне клиента MiniMongo myCollection будут удалены (если они не являются частью нового курсора). В некоторых случаях это то, что вы захотите, но мой вопрос просто: могу ли я предотвратить это? Как?

ответ

2

Здесь есть какая-то магия, когда вы выполняете Meteor.subscribe внутри Tracker.autorun. В принципе, после каждого запуска будет установлена ​​старая подписка на .stop().

У вас есть два варианта,

1- Держите несколько подписок в живых, используя nonreactive блок.

Примечание: вам необходимо написать код для очистки subHandles.

var subHandles = []; 
Tracker.autorun(function(){ 
    var someReactiveVal = someReactiveVar.get(); 
    Tracker.nonreactive(function(){ 
    var subHandle = Meteor.subscribe('myPublication', someReactiveVal); 
    subHandles.push(subHandle); 
    }); 
}); 

2- Сделайте подписку принимать несколько значений, например

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

Template.myTemplate.events({ 
    'click mybutton': function(){ 
     var newVal = getNewVal(); 
     var arrayOfValues = someReactiveVar.get(); 
     arrayOfValues.push(newVal); 
     someReactiveVar.set(arrayOfValues); 
    } 
}) 

// client side 
Tracker.autorun(function() { 
    var arrayOfValues = someReactiveVar.get(); 
    Meteor.subscribe('myPublication', arrayOfValues); 
} 
... 
// server side 
Meteor.publish('myPublication', function(arrayOfValues) { 
    return myCollection.find({ 
     someAttribute: {$in: arrayOfValues} 
    }); 
}); 
+0

Интересно! Мне нравятся оба решения, хотя я не совсем уверен, что второй будет работать: будет ли Метеор сначала удалять материал из старой подписки/публикации и переводить его? Это то, чего я хочу избежать! –

+0

Зависит от вашего определения работы ;-). Да, возможно, он снова отправит все данные по проводам. Это может быть предпочтительнее управлять 'subHandles' для некоторых случаев использования. –

+0

Ну, это (второе решение) не соответствует тому, что я искал - поскольку, строго говоря, это не мешает Метеору удалять уже отправленные документы. Он просто пересылает их. Вы могли бы указать на это в своем ответе. Но приятное объяснение, спасибо! –

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

  • Нет связанных вопросов^_^