使用后退按钮或 Iron 路由后,Meteor 模板没有反应

Meteor template not reactive after using back button or Iron routing

我有一个简单的模板,显示网站列表和允许用户 post 评论网站的详细信息页面。出于某种原因,当单击浏览器或 Iron router link 中的后退按钮到另一个页面然后再次返回时,评论的更新功能不再反应。 collection 已更新但未呈现给模板。控制台中没有抛出任何错误。

我怀疑我的助手有问题,但我是一个彻头彻尾的菜鸟,我花了 7 天或更长时间才理解 meteor,mongo,反应....在参加了一个短期课程后。 ...

我的代码更新 collection:

Template.website_details_form.events({
    "submit .js-add-comment": function(event) {
        var post, theID;
        post = event.target.post.value;
        theID = this._id;
        console.log("the post:" +post);  
        console.log("this is the id: " +theID);

        if(Meteor.user()) {     
             var user = Meteor.user().username;
             if (post != ""){
                 Websites.update({_id: theID}, {$addToSet:{comments:{user:user, comment:post}}});
                 $('input#post').removeClass('error');
             } else{
                 $('input#post').addClass('error');   
             }
         } else {
             swal("Please sign in to post!", "Oops...", "error");
         }      
         event.preventDefault();
     }
});

我的帮手公认的时髦帮手:

var details_ID;
var thecomments; 
Template.website_details.helpers({
    sites:function() {      
        if(details_ID === undefined) {
            return Websites.find(
                { title: 'Goldsmiths Computing Department' });
        } else {            
           return Websites.find({_id:details_ID});
        }                
     }
}); 

Template.website_details_item.helpers({
    comments:function() {
        if(thecomments === undefined) {
            var c = Websites.find({title: 'Goldsmiths Computing Department'}).fetch();
            return c[0].comments;
         } else {
            return thecomments;
         }
     }
});

Template.website_details_form.helpers({
    identify:function(){
    if(details_ID === undefined){
        return Websites.find({ 
            title: 'Goldsmiths Computing Department' });
        } else {            
            return Websites.find({_id:details_ID});
        }            
     }
});

我的路由器:

Router.route('/website_details', function () {
    this.render('navBar', {to: 'navbar' });    
    this.render('website_details', {to: 'main'});
});

我在文档上使用点击功能来获取我在助手中使用的变量的信息....this._id

我确实看到了另一个问题,该问题专门询问了使用后退按钮和 iron 路由后的反应性,但该线程在 github 页面终止,几乎没有交互,并解决了我没有的问题.. .据我所知...我是菜鸟...提前致谢。

查看 code,我发现:

  1. Template.website_details_form.events 中,Websites 集合正在正确更新。
Websites.update({ // Saving to collection
   _id : theID
}, {
   $addToSet : {
      comments : {
         user : user, 
         comment : post
      }
   }
});
  1. 但是,在 Template.website_details_item.helpers 中,评论数据是从 Session 而不是 Websites 集合中读取的。
...
comments: function(){ 
   var post = Session.get('site'); // Reading from Session
   return post.comments;
},
...

解决此问题的两个建议:

  1. helpers访问数据时,直接从Websites集合中读取:
var site_data = Websites.findOne({
   _id: someId
});

if(site_data) { // Check if comments_data is undefined
   return site_data.comment;
} else {
   return null;
}
  1. 更新Websites集合时,立即更新Session数据:
Websites.update({ // Saving to collection
   _id : theID
}, {
   $addToSet : {
      comments : {
         user : user, 
         comment : post
      }
   }
}, function(err, data) {
      if(!err) {
         var site_data = Session.get('site');
         /* Modify site_data */
         Session.set('site', site_data);
      }
});

我会建议第一个选项,因为它避免在 Session 中存储大量数据,而且因为客户端 minimongo 集合已经存储了相同的数据。