This document aims to help aggregate issues and solutions around the defaultContainer deprecation.
The Error Message:
Using the defaultContainer is no longer supported. [defaultContainer#lookup]
breaux, where's my defaultContainer?
Well it is still there, and will continue to work for some time. Likely it will be gone by 1.0.0 final
Why is this happening.
We recieved several issues, these issues were non-obvious but it appeared that they where caused by the defaultContainer leaking between tests. This obviously lead to very unexpected test failures. The quick fix was obviously to ensure the defaultContainer was purged between tests. Upon further investigation, almost all the issues turned out to be childViews which were not wired up correctly. For example not using
this.createChildView on creation of childViews. Ultimately, the existence of the defaultContainer was masking the reported issues, and likely many more. In addition the obvious issues, we are trying to remove our dependency on globals (but that is another story).
migration paths: (WIP)
if you are creating dynamic views in the context of the parentView, you should be using:
if you are creating views outside the context of a parentView (this may not be recommended, but it is happening) you will want to make sure to instantiate your view via the container itself.
this.container.lookup('view:apple') // will provide a instance of apple view.
- appendTo another ember view, should then grab the container of that view.
- continue to flush out this gist
- improve docs/guides
- improve deprecation warnings
- explore methods where this works without developer thought (without perf regressions)
fixes in the wild:
But I have a legitmate usecase not expressed here.
Post a comment, describing the issue, and hopefully a jsbin or jsfiddle demonstrating the issue. As time permits, a solution or migration path will finds its way up into this document.
Q: can we not have views get a container by default? The App gets a container right?
A: App is the root, and as such it creates the initial container.
Q: So when I do createChildView, which container is that using?
A: typically, it is using the container passed down the view hierarchy, and this typically occurs at creation.
Q: Could we set the container when you append it to a container view's childViews array?
A: likely, but its not just the container, it is a place for the framework to wire-up other things. https://github.com/emberjs/ember.js/blob/master/packages/ember-views/lib/views/view.js#L2072
(ask questions in the comments and I will hoist them here.)