“请确保此控制器已使用容器进行实例化”

时间:2014-06-11 18:24:23

标签: ember.js

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”属性,它会给出关于没有容器的错误。这些项目控制器将在外部控制器上观察属性,因此我需要“需求”。那么如何用容器实例化控制器......或者在实例化之后将其破解?

2 个答案:

答案 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();
                     }
                  })
});