在此处查看jsbin示例
这是我的代码:
App = Ember.Application.create();
App.Router.map(function() {
// put your routes here
});
App.IndexRoute = Ember.Route.extend({
model: function() {
return ['red', 'yellow', 'blue'];
}
});
App.DerpMenuComponent = Ember.Component.extend({
items: null,
createSteps: function() {
this.set('items', Ember.ArrayProxy.create({content: []}));
}.on('init'),
register: function(item) {
this.get('items').addObject(item);
}
});
App.DerpMenuItemComponent = Ember.Component.extend({
title: null,
register: function() {
this.get('parentView').register(this);
}.on('didInsertElement')
});
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="http://builds.handlebarsjs.com.s3.amazonaws.com/handlebars-v1.3.0.js"></script>
<script src="http://builds.emberjs.com/tags/v1.8.0/ember.js"></script>
<script type="text/x-handlebars">
<h2>Welcome to Ember.js</h2>
{{outlet}}
</script>
<script type="text/x-handlebars" id="index">
{{#derp-menu}}
{{#each item in model}}
{{#derp-menu-item title=item}}
<div style="background: #CCC; color: #00F; margin: 10px; padding: 5px">{{item}}</div>
{{/derp-menu-item}}
{{/each}}
{{/derp-menu}}
</script>
<script type="text/x-handlebars" id="components/derp-menu">
<ul>
{{#each item in items}}
<li>{{item.title}}</li>
{{/each}}
{{yield}}
</ul>
</script>
<script type="text/x-handlebars" id="components/derp-menu-item">
{{yield}}
</script>
我可以看到,当使用#each
助手将它们以相反的顺序添加到模板中时,derp-menon-元素
以相反的顺序注册。有人能解释一下为什么会这样吗?如果我在derp-菜单
组件中手动输入derp-menon-item
-一切都正确显示,我猜这是因为Handlebar在这种情况下的行为有所不同。有人能提供对这两种情况下发生的事情的见解吗?
didInsertElement
事件总是从最后/最低级别触发,然后向上移动树。这样,当didInsertElement
在父元素上触发时,您可以确定所有子元素都已插入到dom中。
在您的例子中,您正在向父. on('didInsertElement')
注册,您最终会以相反的顺序将元素添加到数组中。
如果您将代码更改为基于. on('init')
(如下所示),那么它们的顺序将相同。
App.DerpMenuItemComponent = Ember.Component.extend({
title: null,
register: function() {
this.get('parentView').register(this);
}.on('init')
});
你可以在这里看到一个工作示例:http://emberjs.jsbin.com/hirolu/1/edit?html,js,输出