我正在和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问题之后它被关闭了。有什么想法吗?
答案 0 :(得分:2)
你正在创造它两次。您已在itemController
上设置了IndexController
,而您实际上是在addPost
功能中创建了控制器。
除了一些奇怪的边缘情况之外,你不应该自己创建一个控制器实例。当您itemControler
时,Ember会为您创建pushObject
个实例,因此您无需手动create
。