In my app I have a list/detail view similar to many of the sample apps (list of posts on the left, selected post on the right). These are nested routes and work great. Inside the selected item template I have some buttons for creating a new item via a modal. I’m using the Ember recommended approach for modals and the modals have a template and an associated controller, but no route. So far this is working great - modal loads, controller populates any required dynamic fields, clicking Submit/Cancel triggers the proper actions, everything is fine and dandy.
I’ve now run into an issue where I need to access another controller’s model from within my modal controller. Usually I’d use the setupController hook in the route to set what I need on the controller but since my modals are routeless this isn’t an option. I’ve tried using the needs API and accessing the model that way but controllers.needed-controller.model comes back as undefined/null. I’ve tried various ways to get at the needed model:
Well I haven’t been able get a bin to reproduce a simplified case of what I’m trying to do which leads me to believe I’m doing something wrong in my code. Will continue to work at reproducing and post back if here if I’m successful at that or making it work.
OK I’ve somewhat traced this back to some namespacing weirdness.
If I type App.__container__.lookup('controller:system-config.vendors.detail') in the console I get the proper reference to the controller I need.
Along those same lines using needs: system-config.vendors.detail in my modal controller throws an error:
Uncaught Error: Assertion Failed: <App.VendorDivisionFormModalController:ember1819>#needs must not specify dependencies with periods in their names (system-config.vendors.detail)
If I use needs: system-config-vendors-detail I get a controller back but it’s empty.
So I guess the real question is how to use NEEDS with a nested resource
My router looks like:
this.resource('system-config', function () {
this.route('vendors', { path: 'vendors' }, function () {
this.route('detail', { path: ':vendor_id' }); // <-- controller I need
});
});
system-config/vendors/detail errors out with Uncaught Error: Assertion Failed: You are looking for a detail controller in the System-config.vendors namespace, but the namespace could not be found
system-config/vendors.detail errors out with the periods in their names error
Looks like I just need to figure out how Ember wants me to reference that controller without the dots. I haven’t been able to find any solid guidance on deeply nested routes/controllers.
Would dependency injection be a viable alternative? Seems like a waste to have an initializer just to inject a single controller into another controller.
but the select in the pages edit route is only working if you click to the modelnames route first? I have put up a working version to show the problem.
@broerse as I understand it controllers are singletons and not part of the application state. As such I don’t believe you can access any of the properties like model unless an active instance of the controller exists e.g. you’re in a route that uses that controller. So if any of your active routes don’t use the modelnames controller then you won’t be able to access any data in it. You can use Ember Inspector to view the current active routes/controllers via the View Tree tab:
I could be WAY off base here but that is my current understanding of how controllers work.