javascript-由于Meteor升级到0.8.0,因此会话变量相关性更改时不会触发模板“渲染”回调

自从升级到0.8.0以来,我一直遇到问题.
渲染的模板不再触发(第一次除外).

我遵循以下建议:
https://github.com/avital/meteor-ui-new-rendered-callback/blob/master/new2/client/each.js

这没有帮助,所以我最终做了一小段代码(通过修改new2示例).

主要区别在于更新是由会话变量更改而不是数据库更改触发的.

这完美地说明了这个问题,因为在此示例中仅渲染了两次渲染:

客户端/each.js

Template.list.items = function () {
  return (Session.get('items') || 'None')
};

var renderCount = 1;
var logRender = function () {
  console.log("rendered #" + renderCount);
  renderCount++;
};

Template.list.rendered = function () {
  logRender();
};

Template.justName.rendered = function () {
  logRender();
};

setInterval(function () {
  Session.set('items', {name: Random.choice(["one", "two", "three"])});
}, 1000);

client / each.html

<body>
  {{> list}}
</body>

<template name="list">
   {{#with items}}
   {{> justName}}
   {{/with}}
</template>

<template name="justName">
  {{name}}
</template>

当Session.set触发内容更新时,如何正确触发Template.justName.rendered回调?

谢谢,

解决方法:

我确实为您提供了一个即时解决方案,但是可能需要重新考虑一下您的实际代码.顺便说一下,这是与这里相同的问题:

Meteor 0.8.0 – Failed to operate DOM in rendered callback

但是这个问题是在不同的背景下提出的,因此有必要回答两次.

那么为什么不触发渲染的回调呢?因为它不会重新渲染.

Blaze对待“如何对更改后的依赖项做出反应”的整体处理方式非常不同,“更好”的人可能会说:它将标识DOM节点,其中“一个”,“两个”或“三个”(在您的情况下是模板本身)存储在其中,而只需替换已更改的部分,即文本内容“一个”,“两个”或“三个”. DOM节点本身以及模板均保持完整.这也意味着,几乎在每种实际情况下,都不必重新执行此DOM节点要做的所有事情.即如果对其进行动画处理,则使用jQuery更改其文本颜色,颜色和动画将仅保留在屏幕上,因此您无需渲染的回调即可重新执行该操作.

在您的情况下,只需重新安排要在“渲染”上执行的操作即可轻松解决问题:

var whatever = function(){
    // whatever you want to do on data-change, in your case calling "logRender" (which needs to be renamed with Blaze, anyway..)
    logRender();
}

然后,您唯一要做的就是在数据更改时将其触发,如下所示:

setInterval(function () {
    Session.set('items', {name: Random.choice(["one", "two", "three"])});
    // calling the function when changing the data, knowing that it WON'T destroy the DOM node it affects
    whatever();
}, 1000);

或反应性地,像这样:

Deps.autorun(function(){
    Session.get("items"); // our dependency, just has to be there, but you can also use it
    whatever(); // will be fired whenever dependency changes
});

核心思想是消除对渲染渲染回调中所做的操作的需求,因为DOM及其对象的标识(以及所有漂亮的jQuery效果)仍然完好无损.因此,剩下要做的一切仅取决于特定的反应性数据更改,这就是为什么存在Deps.autorun()的原因.

在您的特定示例中,您的“ logRender”函数没有任何响应式依赖项,但是如果您添加了一些响应式依赖项并将其放入Deps.autorun(),则只要依赖项发生更改,它将可靠地重新运行.

结论是,Meteor 0.7.x及更低版本使我们犯了将“渲染的”回调函数视为通用自动运行函数的错误,这就是为什么我们现在遇到麻烦并必须修复我们的应用程序.

上一篇:javascript-尾随流星服务器控制台


下一篇:如何将“流星运行android-device”发送到流星服务器?