Meteor Session变量未显示Reactive属性:从Session中删除键后不重新呈现

时间:2016-10-02 12:06:48

标签: javascript session meteor reactive-programming meteor-blaze

当我在Session中设置一个键时,会重新呈现代码,但是当我从Session中删除该键时,它不会重新呈现。

在我的images模板中,我正在侦听点击事件并为会话设置ID。更改会话后,它会重新呈现images模板。但是当我听到另一个click事件并将Session键设置为undefined(甚至试图删除该键)时,不会重新呈现。

我的代码段已附加。

代码段说明: .js文件中有一个template helpers和一个template events。运行meteor app时,getFilteredUser函数会检查会话中是否有可用的过滤器密钥,然后呈现images模板。辅助函数images根据状态Session变量绑定数据。

当调用js_set_image_filter时,它会更新Session变量并重新呈现images模板。调用js_remove_image_filter时,它会再次更新Session变量,但此次不会重新呈现image模板。

为什么模板第二次不重新渲染?

火焰模板:

<body>
    <div class="container">
        {{#if getFilteredUser}}
            <p>Showing images for  "{{getFilteredUser}}" </p>
            <p> <a href="#" class="js_remove_image_filter">  Click Here </a> to remove all filters!</p>
        {{else}}
            <p> Showing all images, no filted is applied! </p>
        {{/if}}
    </div>

    <div class="container">
        {{> images}}
    </div>
</body>

<template name="images">
    <div class="row">
        {{#each images}}
            <div class="col-md-3">
                <div class="thumbnail" id="{{_id}}">
                    <img  class="thumbnail_image" src= "{{a}}" />
                        <div class="js-image">
                            <p>Created by: <a href="#"  class="js_set_image_filter">  {{getuser userid}} </a> </p>
                        </div>
                </div>
            </div>
        {{/each}}
    </div>
</template>

js file:

import {Images} from "/import/images.js";

Template.body.helpers({
  getFilteredUser: function(){
    var user = Meteor.users.findOne({_id: Session.get("userFilter")});
    if(user) return user.username;
    else return undefined;
  },
});

Template.body.events({
  "click .js_remove_image_filter": function(event) {
    delete  Session.keys["userFilter"];
    Session.keys = {};
    Session.set("userFilter", undefined );
  }
});

Template.images.helpers({
  images: function(){
    if(Session.get("userFilter"))
      return Images.find({userid: Session.get("userFilter")}, {sort:{date: -1, rating: -1}});
    else  return Images.find({}, {sort:{date: -1, rating: -1}});
  },
  getuser: function(userid){
    if(Meteor.users.findOne({_id: userid}))
      return Meteor.users.findOne({_id: userid}).username;
    else return "annonymus";
  }
});

Template.images.events({
  "click .js_set_image_filter" : function(event){
    Session.set("userFilter", this.userid);
  }
});

第一个屏幕截图是应用程序的初始视图,当我点击Created By字段时,它会将创建者放入Session变量并仅渲染过滤后的项目。但是当我点击删除过滤器时,会调用js_remove_image_filter函数,它也会修改会话。但是没有重新渲染。

First screenshot After Filter

0 个答案:

没有答案