javascript - 在 Ember 中(重新)呈现 View 模板时如何收到通知?

标签 javascript view ember.js

当 View 的模板因模型更改而刷新时,didInsertElement Hook 不会被触发,因为 Ember 会尝试尽可能多地重用 View 。这给我带来了一些问题,因为我需要在重新呈现模板时选择列表的第一个元素。例如,当从服务器加载新数据或应用程序转换到不同的路由时,就会发生这种情况。

奇怪的是,当应用程序转换到不同的路由时, View 的 init 方法确实被调用。问题在于此时尚未呈现模板,也就是说,尚未使用 Controller 的新内容填充 View 。

简而言之,如何在 View 模板完成重新呈现后通知我以便我可以操作 View 的内容?

请注意,观察 Controller 的模型也不是一种选择,因为在触发回调时 View 尚未更新。

<script type="text/x-handlebars" id="list">
<div>
  <ul>
  {{#each model.items}}
    <li class="item">
      <p>{{title}}</p>
    </li>
  {{/each}}
  </ul>
</div>
</script>

更新each block 被重新渲染时,需要通知 View 。我想使用 this question 中的解决方案,但似乎只有 each block 被重新渲染,而不是整个模板(这是我想要的)。我可以在每个 block 中添加一个触发事件,但这非常昂贵,因为自定义事件将在 each block 的每个循环中触发。

最佳答案

也许这可行:

App.ListView = Ember.View.extend({
    templateName: 'list',
    contentChanged: function() {
        Ember.run.scheduleOnce('afterRender', this, 'selectFirstElement')
    }.observes('controller.content.[]'),
    selectFirstElement: function() {
        // for simplicity
        this.$('li:first').addClass('selected');
    }
});

使用 observes('controller.content.[]') 调用 contentChanged 函数,如果在 Controller 内容中执行了一些更改。为了避免在同一个运行循环中多次调用该函数,我们使用 Ember.run.scheduleOnce('afterRender', ...),所以 selectFirstElement仅被调用一次,并且因为它被安排在 afterRender 队列中,所以您可以操纵 dom。

现场演示 http://jsfiddle.net/marciojunior/4b2V3/

关于javascript - 在 Ember 中(重新)呈现 View 模板时如何收到通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20468015/

相关文章:

javascript - 如何在 Angular 中使用 CSS 相邻兄弟选择器?

javascript - 嵌套路由主干

javascript - Ember-data: DS.attr ("number")应该如何工作?

javascript - 在 ember.js 路由中按属性过滤多个模型

Ember.js - 使用 Handlebars 助手检测 subview 是否已呈现

javascript - Node JS - 在不知道键的情况下通过键合并对象

javascript - 如何从 polymer dom 模块内的函数返回数据?

javascript - 提交模态表单后未呈现重定向页面

php - 关于 CodeIgniter 中的 View

android - 调度触摸事件以查看在 Canvas 上绘制的事件