Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 流星更新集合不';无法在客户端上刷新_Javascript_Mongodb_Meteor - Fatal编程技术网

Javascript 流星更新集合不';无法在客户端上刷新

Javascript 流星更新集合不';无法在客户端上刷新,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,我有一个集合,该集合具有样式属性,我迭代该属性并将其应用于相应的元素: // server side Meteor.publish('elements', function(){ return Elements.find(); }); //client side Meteor.subscribe("elements"); setupElements = function () { var currentUserId = Meteor.userId(); var eleme

我有一个集合,该集合具有样式属性,我迭代该属性并将其应用于相应的元素:

// 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>
文档在数据库中更新,但模板/视图不会对更改做出反应,直到我刷新页面或再次触发事件。服务器更新数据库时,似乎没有在客户端刷新数据库。想知道什么是使重新应用样式成为反应式的正确设置,或者是否有强制刷新模板的方法


提前谢谢

虽然使用标准的反应式html和JQuery可能有更好的方法来完成您正在做的事情。就你的问题而言:

Javascript是异步的。
setupElements
在结果从服务器到达之前激发。只需在
回调中启动它即可。call
回调:

Meteor.call('updateElements', setupElements);

什么。。。你为什么要评估()?eval()字符串似乎已经过时了。你是在遵循某种邪恶的教程吗?@Poyli请记住客户端上的javascript是异步的。正在发生的事情是,
setupElements
在调用任务完成之前正在运行。@Kyll这只是我粗略地尝试遍历每个对象,获取相应的id并应用其样式属性。需要重构该部分,但将单独进行。我明白了,我认为客户端维护了一个过时的collection版本,但它只是在更新准备就绪之前启动的。是的,当前的设置肯定可以重构,我将单独进行研究。谢谢!
Meteor.call('updateElements', setupElements);