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