2017-02-01 3 views
0

Ok так что это немного странно ...MeteorJS - Элемент списка не обновляется после осуществления публикации/подписки и методы/вызовы

Я получил эти методы на стороне сервера ...

Meteor.publish('todos', function() { 
return Todos.find({userId: this.userId},{sort:{createdAt:-1}}); 
}); 

Meteor.methods({ 
    editTodo: function(todoId) { 
     Todos.update(todoId, {$set: {checked: !this.checked}}); 
    } 
}); 

И вот вызов на стороне клиента ....

Template.list.helpers({ 
    todos: function(){ 
     Meteor.subscribe('todos'); 
     return Todos.find({}); 
    } 
}); 
Template.list.events({ 
    "click .toggle-check": function(){ 
     Meteor.call('editTodo',this._id); 
    }}); 

проблема заключается в том, что, когда нажмите на кнопку «.toggle проверки» происходит ... „проверено“ булево срабатывает на но никогда не отрывается .. .. это.checked (в {ch ecked:! this.checked}), не ссылаясь на поле, сразу прочитанное из коллекции? Или, может быть, я внедряю что-то неправильно при подписке на данные?

Пожалуйста, помогите!

+1

В вашем методе «this.checked» разрешает правильную вещь? Это выглядит странно. – zim

+0

он визуализируется в представлении, потому что я передаю проверенное состояние в флажок, который, кажется, происходит (после некоторого дополнительного исследования), заключается в том, что обновление не происходит. То, что упускается из этого, заключается в том, что у меня есть полный CRUD, работающий SELECT, INSERT, DELETE, все работает нормально. UPDATE, похоже, не работает должным образом. При дальнейшем рассмотрении я заметил, что когда я нажимаю кнопку обновления, я извлекал и показывал строку в консоли (через серверную сторону), проверяется, всегда устанавливается значение true, но никогда не становится ложным. Итак! This.checked не работает по существу. Также не разрешать/отрицать! – Metrophobe

+0

Да, я говорю, что «это», вероятно, не так, как вы думаете в этом контексте. По крайней мере, я никогда не видел, чтобы это так использовалось. я бы продолжил отладку использования «этого». – zim

ответ

1

Я считаю, что проблема связана с регистрацией подписки, как вы предложили, точнее, что ваш Meteor.subscribe() вызывается из функции Template.helpers.

Попробуйте перевести подписку на предыдущую страницу или событие шаблона, например Template.body.onCreated() или Template.list.onCreated() (в зависимости от ваших требований).

В документации Метеора есть хороший пример: https://www.meteor.com/tutorials/blaze/publish-and-subscribe (см. Раздел 10.3).

+0

Прямо сейчас я не нахожусь перед ПК, но поеду за твоим предложением и оставил тебя в курсе. Итак, вы думаете, что это связано с задержкой? Если я переместлю все подписки на Meteor.startup(), вы думаете, что это решит проблему? – Metrophobe

+0

Я считаю, что это правильно (для обоих этих вопросов :) В конце концов, я переместил свои вызовы 'Meteor.subscribe()' внутри 'Template.body.onRendered (function() {})' в '\ import \ startup \ client \ index.js' и все работает очень плавно сейчас – David

+0

, хотя подписка не должна быть в помощнике (я бы переместил ее в onCreated()), я не думаю, что это проблема. в этом помощнике find() все равно должен быть реактивным. просто не нужно постоянно бить эту подписку каждый раз, когда Блейз решает позвонить этому помощнику. один раз достаточно. – zim

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