当我在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
函数,它也会修改会话。但是没有重新渲染。