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

ma​​in.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 对象没有反应性行为的主要内容,如果未能解决你的问题,请参考以下文章

Meteor Session 和浏览器刷新

如何渲染 Meteor Session 变量的 HTML?

使输入上的 disabled 属性与 Meteor 助手反应的最佳方法是啥?

在 Meteor 中按与当前用户的距离对用户进行反应性排序?

spss 回归中 r值 f值 多大

Meteor 的反应在幕后是如何工作的?