Ember.js:' init'在ObjectController上调用两次钩子

时间:2014-05-01 03:37:03

标签: javascript ember.js

我正在和Ember一起摆弄,我遇到了让我困惑的事情。

我有一个带有项目控制器(Index)的ArrayController(Post)。对于init项控制器上的Post挂钩,我让它将调试行发送到控制台。每个帖子都会发送两次调试语句,我无法弄清楚原因。

JSBin上的代码: http://emberjs.jsbin.com/momikuto/14/edit

HTML:

<script type="text/x-handlebars">
  {{outlet}}
</script>

<script type="text/x-handlebars" data-template-name="index">
  {{each controller itemViewClass="App.PostView"}}
</script>

<script type="text/x-handlebars" data-template-name="post">
  POST {{id}}<br />
</script>

JavaScript的:

App = Ember.Application.create();

App.IndexController = Ember.ArrayController.extend({
  itemController: 'post',
  templateName: 'index',

  addPost: function (id) {
    this.pushObject(App.PostController.create({ id: id }));
  }
});

App.PostController = Ember.ObjectController.extend({
  debug: function () {
    console.log('init for post ' + this.get('id'));
  }.on('init')
});

App.IndexView = Ember.View.extend({
  didInsertElement: function () {
    this.get('controller').addPost(1);
    this.get('controller').addPost(2);
  }
});

App.PostView = Ember.View.extend({
  tagName: 'span',
  templateName: 'post'
});

输出:

init for post 1
init for post 1
init for post 2
init for post 2

如果我删除帖子2并仅使用帖子1,我只会获得init for post 1两次。如果我添加一个帖子,我会把它们全部三个。 ArrayControl中的Post对象数似乎与问题无关。


我在Ember Github上看到了一个帖子,但在假定它不是Ember问题之后它被关闭了。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

你正在创造它两次。您已在itemController上设置了IndexController,而您实际上是在addPost功能中创建了控制器。

除了一些奇怪的边缘情况之外,你不应该自己创建一个控制器实例。当您itemControler时,Ember会为您创建pushObject个实例,因此您无需手动create