【问题标题】:Calling code after {{#each}} has rendered in ember.js?在 ember.js 中呈现 {{#each}} 之后调用代码?
【发布时间】:2014-12-30 19:33:58
【问题描述】:

我试图在 Ember {{#each}} 标记完成循环其项目后调用一些代码。我见过其他看起来相似的问题,答案总是在视图上实现didInsertElement。这似乎对我不起作用,因为我正在尝试访问未使用视图呈现的 html 对象,因为它们位于 {{#each}} 中。

这是我的 html 的样子。

<script type="text/x-handlebars" id="user">
  {{#if isEditing}}
    <div class="well">
    {{partial 'user/edit'}}
    <button {{action 'doneEditing'}} class="btn btn-default">Save</button>
    <button {{action 'cancelEditing'}} class="btn btn-default">Cancel</button>
    </div>
  {{else}}
    <button {{action 'edit'}} class="btn btn-default">Edit</button>
  {{/if}}
</script>

<script type="text/x-handlebars" id="user/edit">
  {{#view 'editor'}}
    <div id="sList" class="btn-group-vertical" role="group">
      {{#each s in model}}
        <button class="btn btn-default">
        {{s.theme}}
        </button>
      {{/each}}
    </div>
  {{/view}}
</script>

还有我的 javascript

App.UserRoute = Ember.Route.extend({
  model: function(params) {
    return this.store.all('strength')
  }
});

App.UserController = Ember.ObjectController.extend({
  isEditing: false,  
  actions: {
    edit: function(){
      this.set("isEditing", true);
    },
    doneEditing: function(){
      this.set("isEditing", false);  
    },
    cancelEditing: function(){
      this.set("isEditing", false);
    }
  }
});

App.EditorView = Ember.View.extend({
  didInsertElement: function() {
    //Do something to the button elements
  }
});

当我尝试运行它时,只要我点击编辑按钮和部分加载,在didInsertElement 尝试访问按钮元素后,我在控制台中收到错误消息。好像 div 中的元素还没有渲染。那么如何判断{{#each}} 是否已将元素插入到 html 中呢?我知道这可能会让人感到困惑,但我们非常感谢您提供任何帮助。

【问题讨论】:

  • 如果你能把它放到一个 jsbin 中来说明你的问题 - 那真的会帮助我们帮助你:)
  • 你想对按钮做什么?更有可能的是,您可以避免使用更惯用的 Ember 进行直接 DOM 操作
  • 按照@sunrize920 的建议,您也许可以在didInsertElement 中使用jQuery 委托,但您没有发布足够的上下文让我判断这是否适合您.委托将监听选择器上的事件,即使它们是在委托创建后添加到 DOM 中的。

标签: javascript jquery html ember.js ember-data


【解决方案1】:

在 afterRender 队列中安排你的代码在视图的内容被渲染后运行。

App.EditorView = Ember.View.extend({
  didInsertElement: function() {
    Ember.run.schedule('afterRender', function() {
      this.$().find('button').each(function() {
        // $(this) is a button in this function
      });
    }.bind(this));
  }
});

【讨论】:

  • 解释你的解决方案是什么;不要只是过去的代码
猜你喜欢
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
相关资源
最近更新 更多