Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.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
Meteor on collection更改更新模板选择元素_Meteor - Fatal编程技术网

Meteor on collection更改更新模板选择元素

Meteor on collection更改更新模板选择元素,meteor,Meteor,我用它来帮助我的Meteor应用程序中的选定元素看起来更好 然而,我遇到了一个问题,在向Meteor集合提交更改时,反应性会将更改推回到模板,从而重写select元素并销毁原始select元素,这也会带走引导select内容 我想知道我是否有办法阻止这种事情发生。 我试着在更新时收听更改并调用selectpicker,但它不起作用 Applications.find().observe({ changed: function() { console.log('something chan

我用它来帮助我的Meteor应用程序中的选定元素看起来更好

然而,我遇到了一个问题,在向Meteor集合提交更改时,反应性会将更改推回到模板,从而重写select元素并销毁原始select元素,这也会带走引导select内容

我想知道我是否有办法阻止这种事情发生。 我试着在更新时收听更改并调用selectpicker,但它不起作用

Applications.find().observe({
changed: function() {
    console.log('something changed');
            $('.selectpicker').selectpicker();
}
});
我甚至试着把事情推迟一点,也无济于事

Applications.find().observe({
changed: function() {
    console.log('something changed');
    setTimeout(function(){
        $('.selectpicker').selectpicker();
        console.log('trying to update select picker');
    }, 1000);
}
});
以前有没有人遇到过这个问题,并且知道如何解决它

编辑:这是模板代码

<div class="form-group">
    <label for="college" class="control-label">College/ University</label>
    <select class="selectpicker" name="college" placeholder="Select a College/ University">
        {{#each colleges}}
            <option value="{{slug}}">{{name}}</option>
        {{/each}}
    </select>
</div>

在HTML模板中,如果将select元素包围起来,常量块中的部分将不会重新呈现。也许这是一个解决办法?

我也有同样的问题。事实证明,从我的Meteor应用程序中删除“保留输入”包是有帮助的。也许值得一试?或者,如果您不想这样做,那么从select元素中删除id和/或name属性似乎也会产生同样的影响。

自从提出这个问题以来,情况发生了一些变化。使用新的Blaze渲染引擎,渲染事件只会抛出一次。在渲染时,这些选项不可用,导致样式良好但选择为空

下面的示例处理这些更改。诀窍是在启动时呈现selectpicker一次,然后在选项发生更改时刷新。因此,必须将其移动到自己的模板块中

模板:

<template name="whatever">
<div class="form-group">
    <label for="college" class="control-label">College/ University</label>
    <select class="selectpicker" name="college" placeholder="Select a College/ University">
        {{#each colleges}}
            {{> selectOption}}
        {{/each}}
  </select>
</div>
</template>

<template name="selectOption">
    <option value="{{slug}}">{{name}}</option>
</template>

提神有点棘手。当您将集合加载到select时,将为每个选项引发事件。就我而言,我有数百个文档/选项。这会导致数百次刷新,浏览器会挂起几秒钟。因此有一个很小的超时,它只需要为大量更改刷新一次。

这是个好主意。但如果它在一个常量块中,这是否意味着它不会得到任何模型更改的更新?保留块是否有效?@Tri-正如您所说:常量块帮助器中的文档更新不会显示。放置$'.selectpicker.selectpicker的最佳位置可能在函数Template.yourTemplateName.rendered中,但是每次重新呈现时,都会从头开始创建引导选择元素中的选定元素,并且不会再选择上一个选定项。我想不出一个简单的方法来解决这个问题,但如果我是你,我会使用这个解决方案,并在你的选择中添加selected=selected到selected。谢谢@Peppe,我已经在渲染函数中调用了它,但这并不能解决我问题中提到的问题,即模型更改,select元素被刷新,从而启动引导select。我不认为删除id或名称是一个好主意-它们的存在是有原因的,既有语义,也允许表单处理。不,我也不会这样做。就个人而言,我还没有找到一个合理的工作选择替代流星应用程序。
Template.whatever.rendered = function(){
  $('.selectpicker').selectpicker();
};

var renderTimeout = false;
Template.selectOption.rendered = function(){
  if(renderTimeout !== false) {
    Meteor.clearTimeout(renderTimeout);
  }
  renderTimeout = Meteor.setTimeout(function() {
    $('.selectpicker').selectpicker("refresh");
    renderTimeout = false;
  }, 10)
};