自从升级到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及更低版本使我们犯了将“渲染的”回调函数视为通用自动运行函数的错误,这就是为什么我们现在遇到麻烦并必须修复我们的应用程序.