Meteor更新集合不会在客户端上刷新

时间:2015-04-15 09:00:38

标签: javascript mongodb meteor

我有一个具有样式属性的集合,我遍历并应用于相应的元素:

// server side
Meteor.publish('elements', function(){
  return Elements.find();
});

//client side
Meteor.subscribe("elements");

setupElements = function () {
    var currentUserId = Meteor.userId();
    var elements = Elements.find({user: currentUserId}).fetch();
    elements.forEach(function(e){
    var elementId = e._id;
    eval("document.getElementById('" + elementId + "').removeAttribute(\"style\")");
    var width = e.width;
      for (var i in width) {
        eval("document.getElementById('" + elementId + "').style.width"= \"" + width[i] + "\"");
      }
    });
}

Template.element.rendered = function() {
  if(!this._rendered) {
    this._rendered = true;

    // iterate through element and apply width style to each
    setupElements();
  }
}

// template
<template name="element">
  {{#each element}}
    <div id="{{_id}}" class="element">{{text}}</div>
  {{/each}}
  <button id="change-style">Change style</button>
</template>

模板渲染并将相应的宽度应用于每个元素。但是,当我触发如下更新时:

'click #change-style': function() {
    Meteor.call('updateElements'); // assume server-method successfully updated all elements
    setupElements(); // thought this will fetch new style and re-apply
  },

文档在数据库中更新,但模板/视图在更新页面或再次触发事件之前不会对更改做出反应。似乎在服务器更新数据库时,客户端不会刷新数据库。想知道什么是使重新应用样式具有反应性的正确设置,或者是否有办法强制刷新模板。

提前致谢!

1 个答案:

答案 0 :(得分:2)

虽然有可能通过使用标准的反应式html&amp; amp;更好的方法来做你正在做的事情。 JQuery的。在您的确切问题的背景下:

Javascript是异步的。 setupElements在结果从服务器到达之前触发。只需在.call回调中点击它:

Meteor.call('updateElements', setupElements);