jQuery的选择流星1.1.0.2不工作onRendered(jQuery select not

2019-10-24 05:20发布

我的工作我已经部署了一个应用程序,并试图让一切到最新版本,升级代码,以最新工艺的优势,就像在Template.onRendered订阅,但我似乎已经打破了我的排序。

我的模板(简体有点)

<template name="formEdit">
  <div id="formContainer">
    {{#if Template.subscriptionsReady}}
      {{#with form this}}
        <table id="headerFieldsTable" class="table">
          <tbody id="headerFields">
            {{#each headerFields}}
              <tr class="headerFieldRow">
                <td>{{> headerFieldViewRow }}</td>
              </tr>
            {{/each}}
          </tbody>
        </table>

        <h5>Form Fields</h5>
        <table id="formFieldsTable" class="table">
          <tbody id="formFields">
            {{#each formFields}}
              <tr class="formFieldRow">
                <td>{{> formFieldViewRow }}</td>
              </tr>
            {{/each}}
          </tbody>
        </table>

      {{/with}}
    {{else}}
      Loading...
    {{/if}}
  </div>
</template>

和模板的onRendered():

Template.formEdit.onRendered(function() {
  var formsSubscription = this.subscribe('formById', this.data);
  var headerFieldsSubscription = this.subscribe('headerFieldsForForm', this.data);
  var formFieldsSubscription = this.subscribe('formFieldsForForm', this.data);

  var formEditTemplate = this;
  this.autorun(function() {
    if (formsSubscription.ready() && headerFieldsSubscription.ready() && formFieldsSubscription.ready()) {
formEditTemplate.$(''));
      formEditTemplate.$('#headerFields').sortable({
        axis: "y",
        stop: function(event, ui) {
          var headersToSave = [];
          $('#headerFieldsTable div.headerField').each(function(idx, headerFieldDiv) {
            var header = Blaze.getData(headerFieldDiv);
            header.sequence = idx;
            headersToSave.push(header);
          });
          _.each(headersToSave, function(header) { header.save(); });
        }
      });

      formEditTemplate.$('#formFields').sortable({
        axis: "y",
        stop: function(event, ui) {
          var feildsToSave = [];
          $('#formFieldsTable div.formField').each(function(idx, formFieldDiv) {
            var field = Blaze.getData(formFieldDiv);
            field.sequence = idx;
            feildsToSave.push(field);
          });
          _.each(feildsToSave, function(field) { field.save(); });
        }
      });
    }
  });
});

但对于页眉和页脚两者的formEditTemplate.$('#headerFields')formEditTemplate.$('#formFields')似乎都没有结果。 这似乎是DOM实际并不存在。 我以为.ready()上的所有订阅调用将纠正这一点,但认为存在如下情况:大火还没有搞掂DOM又一个时间问题,但订阅的确做到了。 我这样说是因为我把在Chrome中断点就在第一线if ,浏览器仍然显示“正在加载...”。

我也试图用电线短路的事情由具有辅助安装程序的排序放置在年底{{#with}}块,希望也许这将是最后的渲染,但也不能工作。

我发现,似乎建议增加一个计时器流星论坛的一些文章,但是这似乎很“的hackish”。 是否有运行JS需要的DOM的新格局被完全初始化?

Answer 1:

相反,时间延迟砍的,我建议你使用Tracker.afterFlush()以保证DOM已经创建和更新。 下面是一个描述流星文档 :

调度的功能,下次的冲水过程中被调用,或以后在当前冲洗,如果一个是在进步,毕竟无效的计算已重新运行。 该功能将一次而不是在随后的刷新,除非afterFlush再次调用运行。

所以,你的里面if语句,你可以用代码块,像这样

if (formsSubscription.ready() && headerFieldsSubscription.ready() && formFieldsSubscription.ready()) {
  Tracker.afterFlush( function () {
    //Code block to be executed after subscriptions ready AND DOM updated
  });
}

这里是使用实施例的参考Tracker.afterFlush



文章来源: jQuery select not working in Meteor 1.1.0.2 onRendered