The solution here would be in a named-view (non) match. Here is a working plunker .
We must place the name ui-view inside the parent view (or use a more precise name, see, for example, here )
So, the parent, home template should contain the name ui-view , for example. nameOtherThanSpace
<div ui-view="nameOtherThanSpace" ></div>
And the definition of a child should be aimed at this view, a complete fragment:
$stateProvider .state('home', { url: '/home', views: { 'main': { controller: 'HomeCtrl', template: '<div>' + '<h1>hello from parent</h1>' + '<hr />' + '<div ui-view="nameOtherThanSpace" ></div>' + '<div>', } } }) .state('home.details', { url: '/details', views: { "nameOtherThanSpace": { template: "<h2>hello from a child</h3>", controller: function($scope, $http, $state) {}, } } });
How to use more specific name names:
Work plunker using nameOtherThanSpace name instead of "" (space)
source share