提问者:小点点

为什么#每个遍历顺序在组件内部颠倒?


在此处查看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在这种情况下的行为有所不同。有人能提供对这两种情况下发生的事情的见解吗?


共1个答案

匿名用户

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,输出