Meteor Session 对象没有反应性行为
Posted
技术标签:
【中文标题】Meteor Session 对象没有反应性行为【英文标题】:Meteor Session object not behaving reactively 【发布时间】:2015-06-19 10:31:12 【问题描述】:我正在学习Discover Meteor 教程,但一个烦人的问题不断出现。当我使用控制台更改应用程序数据时,应用程序不会像承诺的那样为反应性数据源自动更新。不知道发生了什么。这是一个示例来说明问题(并确定是代码本身还是其他问题)。
初始化应用并包含下划线和铁路由:
meteor create testApp
meteor add underscore
meteor add iron:router
创建以下文件结构:
.
└── testApp
├── .meteor
| └── [meteor auto generated files]
├── lib
| └── router.js
└── client
├── layout.html
├── layout.js
├── main.html
└── pageone.html
router.js
Router.configure(
layoutTemplate: 'layout',
);
Router.route('/', name:'pageone');
layout.html
<template name="layout">
<div class="container">
<header class="navbar navbar-default" role="navigation">
<div class="navbar-header">
<a class="navbar-brand" href="pathFor 'pageone'">pageTitle</a>
</div>
</header>
<div id="main">
> yield
</div>
</div>
</template>
layout.js
Template.layout.helpers(
pageTitle: function() return Session.get('pageTitle') || "placeholder";
);
main.html
<head>
<title>testApp2</title>
</head>
pageone.html
<template name="pageone">
<div class="message">
<h1>Test App for SO</h1>
</div>
</template>
现在使用meteor
命令从testApp
目录运行应用程序,然后在浏览器中导航到localhost:3000
。
现在在控制台中输入Session.set('pageTitle', 'New Title');
。
我正在使用 Chrome,当我这样做时,我正在监视流星服务器的终端窗口会打印出 Client modified -- refreshing
。然而,没有任何反应,即使 Session
对象应该是反应性的。然后,如果我刷新选项卡,我会看到一个空白屏幕,如果我想让我的应用程序再次运行,则必须手动重新启动流星服务器。
有人知道这里发生了什么吗?
【问题讨论】:
@Kyll。我已经按照你的建议添加了一个 MCVE。希望这能让事情更清楚。 【参考方案1】:当我在您的存储库中搜索 Session.get
时,我找不到任何匹配项,因此您没有使用任何 Session 变量...
https://github.com/dantzlerwolfe/microscope/search?q=Session.get
试试这个让你的例子起作用,并重新考虑你用domain
做什么。这不是流星的工作原理......
Template.postItem.helpers(
name: function()
return Session.get('pageTitle');
);
【讨论】:
我已经按照上面 Kryll 的建议添加了一个 MCVE。即使我添加了助手,我仍然遇到同样的问题。您能否根据我在编辑中提供的内容重新创建问题?【参考方案2】:这是 Chrome 控制台本身的“问题”。实际上(我现在觉得很愚蠢)控制台与浏览器具有完全独立的设置。
-
打开控制台
点击齿轮图标。
确保未选中“禁用 javascript”框。
现在您应该可以从控制台修改您的应用了。详情请见THIS SO Q&A。
【讨论】:
【参考方案3】:嗯,我已经检查了存储库,一切正常。除了更改页面标题 - 但它不应该。
请注意,在layout.html
中您指定了助手pageTitle
,但您没有指定函数。 (我假设您认为您可以简单地访问模板内的会话变量)。在layout.js
中,您必须创建一个名为pageTitle
的新助手,它返回会话变量。像这样:
Template.layout.helpers(
pageTitle: function()
return Session.get("pageTitle");
)
【讨论】:
我已经按照上面 Kryll 的建议添加了一个 MCVE。即使我添加了助手,我仍然遇到同样的问题。您能否根据我在编辑中提供的内容重新创建问题?以上是关于Meteor Session 对象没有反应性行为的主要内容,如果未能解决你的问题,请参考以下文章
使输入上的 disabled 属性与 Meteor 助手反应的最佳方法是啥?