Uncaught Error: Assertion Failed: `<(subclass of Ember.ObjectController):ember947> specifies `needs`, but does not have a container. Please ensure this controller was instantiated with a container.
如果由于某种原因控制器没有容器,我该如何提供容器?上下文如下,但这基本上是被问到的问题。
上下文显示,在Ember.CollectionView中显然没有为单个项目提供控制器的简单方法,这是ember.js/issues/4137中概述的问题。
获取项目控制器的唯一方法是在init方法中将它们内联声明为CollectionView的内联itemViewClass声明(由该票证的发起者确认):
var someCollectionView = Ember.CollectionView.extend({
itemViewClass: Ember.ListItemView.extend({
templateName: "foo-item",
init: function(){
var content = this.get('content');
var controller = Ember.ObjectController.extend({
// controller for individual items in the collection
actions: {
// actions specific to those items
}
}
}).create({
content: content,
});
this.set('controller', controller);
this._super();
}
})
});
所以这是有效的,但是如果你向这个控制器添加一个“needs”属性,它会给出关于没有容器的错误。这些项目控制器将在外部控制器上观察属性,因此我需要“需求”。那么如何用容器实例化控制器......或者在实例化之后将其破解?
答案 0 :(得分:2)
通常建议访问App.__container__
。视图,控制器,路由等所有核心对象都应该由容器实例化。在这种情况下,它们还将具有container
属性(普通JS属性,而不是Ember属性),您可以使用它来实例化其他对象,而这些对象又可以访问容器。
所以而不是
Ember.ObjectController.create(...)
试
this.container.lookupFactory('controller:object').create(...)
如果容器未定义,您必须上链,并确保您调用此对象的任何对象也从容器中出来。
答案 1 :(得分:0)
看起来你可以做到
...
}).create({
content: content,
container: App.__container__
});
this.set('controller', controller);
this._super();
}
})
});