与帮助者的流星反应

时间:2015-05-16 18:41:05

标签: meteor

调试应用&我偶然发现了一些我从未注意过的事情。举一个简单的例子,我有一个简单的链接,有2个帮助器来设置样式,如下所示:

<a class="{{tabHasError}} {{activeTab}}">Test</a>

进入此目的的助手如下:

tabHasError: function() {
  console.log('invalidated!');
}
activeTab: function() {
  if (Session.equals('activeTab', this.tabIdx)) return 'active';
}

现在,每次Session var更改时,activeTab都会失效,这是预期的。不期望的是tabHasError也是无效的。为什么会这样?这是正常的吗?是因为它们都附属于同一个元素吗?除了合并功能,还有什么方法可以避免这种情况?或者甚至更好,为什么MDG做出这个设计决定?

2 个答案:

答案 0 :(得分:2)

使用铁制路由器,观察您描述的行为是正常的。

当主计算依赖项发生变化时,将使用当前正在刷新的模板。调用Session.set将调用模板变量的刷新。当然,它很多,但它是确保模板始终是最新的最简单的方法之一。

如果您正在寻找更大的应用程序,您可以查看React.js集成,这将使您能够仅刷新模板上的好变量。

实际上,在您的示例中,tabHasError的值不应更改,但重新呈现模板将调用函数tabHasError来检查是否有任何更改。在这种情况下,没有。

如果行为不够明确,我就在附近。有一个巨大的星期天!

答案 1 :(得分:1)

我注意到这只发生在元素的属性中。根据关于之前的UI引擎(Shark)的Event Minded视频,我认为这种行为是非常明确的:它只会重新呈现受影响的DOM元素。

考虑到你的代码Blaze正在重新渲染DOM元素,使与之相关的先前计算无效是有意义的。如果您将此帮助程序放在a元素内,则不会失效。