Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor 在不使上下文无效的情况下读取会话变量_Meteor - Fatal编程技术网

Meteor 在不使上下文无效的情况下读取会话变量

Meteor 在不使上下文无效的情况下读取会话变量,meteor,Meteor,是否有一种方法可以在模板更改时读取会话变量而不重新呈现模板 情景: 我使用jQuery动态更改元素的样式,但是当创建新元素时,我想设置其默认样式(我知道在呈现元素时可以调用相同的jQuery命令) 示例: <template name="image"> <!-- How can I avoid -height- being reactive --> <img src="img.jpg" style="height: {{height}}"> &

是否有一种方法可以在模板更改时读取会话变量而不重新呈现模板

情景:

我使用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")});
    }
};

Templates.image.height=函数(){
返回会话。获取(“高度”);
};
Templates.controls.events={
'单击#btn':函数(){
//更改所有现有图像的高度
$(“img”).css({height:Session.get(“height”)});
}
};
我希望添加的每个新图像都将高度存储在会话变量中,而无需重新渲染
img
。我能想到的所有解决方案都像黑客一样。

您可以使用preserve:

为什么不只使用jquery或Handlebar来处理值,为什么两者都使用?具有一致性,因此您可以更好地管理代码

如果你发布一些代码,我可以帮你举个例子

用您的代码编辑该示例

仅使用把手的代码:

<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");
    }
};

{{#隔离}
{{/隔离}
Template.image.height=函数(){
return Session.get(“height”)| |“0px”//默认高度为未定义会话
};
Template.controls.events={
'单击#btn':函数(){
//这到底是做什么的?
//$(“img”).css({height:Session.get(“height”)});
设置(“高度”、“40px”);
}
};

为了防止重新呈现整个模板,请将反应变量
{{{height}}
放入
{{isolate}}
中。请参阅反应性隔离:

会话将其值存储在
会话中。键
,但它们是序列化的。要反序列化它们,您可以从以下位置使用
parse
函数:

然后,不要执行
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); });
};  
更新日期:2016年2月15日 仪表目前已弃用,但仍能正常工作。请改用
Tracker

Session.getNonReactive = function (key) {
  return Tracker.nonreactive(function () { return Session.get(key); });
};  

我已经编辑了我的帖子,我不知道你在用这个按钮做什么,但是为了停止图像刷新,你可以使用隔离来改变它,这听起来很不错inside
style
未按预期渲染。你尝试过吗?我在没有隔离的情况下再次尝试,但我无法刷新/重画图像:gist与我用于测试的项目一起@因此,我移动了隔离abit,因此这应该可以按照你的意愿工作,但现在每次大小更改时都会重新渲染图像。这就是我想要的首先要避免。请查看原始代码。请尝试要点中的代码,看看它是否重新渲染,我无法让它重新绘制,也许你正在对图像进行jqueryy操作?
Session.getNonReactive = function (key) {
  return Tracker.nonreactive(function () { return Session.get(key); });
};