有没有办法从Session变量读取而不更改模板时重新渲染?
情景:
我使用jQuery动态更改元素的样式,但是当创建新元素时,我想设置其默认样式(我知道在渲染元素时我可以调用相同的jQuery命令)
示例:
<template name="image">
<!-- How can I avoid -height- being reactive -->
<img src="img.jpg" style="height: {{height}}">
</template>
Templates.image.height = function() {
return Session.get("height");
};
Templates.controls.events = {
'click #btn': function() {
// Change the height of all exiting images
$("img").css({height: Session.get("height")});
}
};
我希望添加的每个新图像都将高度存储在会话变量中,而无需重新呈现img
。我能想到的所有解决方案都像黑客一样。
答案 0 :(得分:3)
会话将其值存储在Session.keys
中,但它们已被序列化。要反序列化它们,您可以使用https://github.com/meteor/meteor/blob/master/packages/session/session.js中的parse
函数:
var parse = function (serialized) {
if (serialized === undefined || serialized === 'undefined')
return undefined;
return EJSON.parse(serialized);
};
然后,代替Session.get('key-name')
,执行:
parse(Session.keys['key-name'])
。这应该与Session.get
相同,而不会使任何上下文无效。将所有这些放在一起,这是一种似乎有用的方法:
Session._parse = function (serialized) {
if (serialized === undefined || serialized === 'undefined')
return undefined;
return EJSON.parse(serialized);
};
Session.getNonReactive = function (key) {
var self = this;
return self._parse(self.keys[key]);
};
更新2013年3月13日: Meteor刚刚发布了v0.5.8,并带有一个新功能。以下是执行此操作的新方法:
Session.getNonReactive = function (key) {
return Deps.nonreactive(function () { return Session.get(key); });
};
更新15/2/2016
Meter目前已被弃用,但它仍然有效。请改用Tracker
:
Session.getNonReactive = function (key) {
return Tracker.nonreactive(function () { return Session.get(key); });
};
答案 1 :(得分:2)
您可以使用保存:http://docs.meteor.com/#template_preserve
为什么不只使用jquery或把手来处理这个值,为什么两者兼而有之?通过一致性,您可以更好地管理代码。
如果您发布了一些代码,我可以帮您举个例子
修改您的代码
的示例您的代码仅使用把手:
<template name="image">
<!-- How can I avoid -height- being reactive -->
{{#isolate}
<img src="img.jpg" style="height:{{height}}">
{{/isolate}}
</template>
Template.image.height = function() {
return Session.get("height") || "0px"; //Default height is no session defined
};
Template.controls.events = {
'click #btn': function() {
//What does this do exactly?
//$("img").css({height: Session.get("height")});
Session.set("height","40px");
}
};
为防止重新呈现整个模板,请将反应变量{{height}}
放在{{#isolate}}
中。请参阅反应性隔离:http://docs.meteor.com/#isolate