ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-21 23:34:45  阅读:201  来源: 互联网

标签:spacebars meteor javascript


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

标签:spacebars,meteor,javascript
来源: https://codeday.me/bug/20191121/2055473.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有