When I click on a tab, the corresponding controller gets executed 4 times. Whys that?
E.g. DetailsPersonController
's init
function is executed 4 times. Should only be exectuted once the tab's view gets loaded.
Html Tabs:
<tabset>
<tab ng-repeat="tab in vm.tabs()"
heading="{{ tab.text | translate }}"
ui-sref="p.search.details.{{ tab.id }}"
active="tab.active">
<div ui-view="tabContent"></div>
</tab>
</tabset>
States:
.state( "p.search.details", {
url: "/details",
abstract: true,
templateUrl: "app/modules/partials/p/search/details/details.html",
controller: "DetailsController",
controllerAs: "vm"
} )
.state( "p.search.details.person", {
url: "/person",
views: {
"tabContent": {
templateUrl: "app/modules/partials/p/search/details/person/person.html",
controller: "DetailsPersonController",
controllerAs: "vm"
}
}
} )
.state( "p.search.details.details", {
url: "/details",
views: {
"tabContent": {
templateUrl: "app/modules/partials/p/search/details/details/details.html",
controller: "DetailsDetailsController",
controllerAs: "vm"
}
}
} )
.state( "p.search.details.driver", {
url: "/driver",
views: {
"tabContent": {
templateUrl: "app/modules/partials/p/search/details/driver/driver.html",
controller: "DetailsDriverController",
controllerAs: "vm"
}
}
} )
.state( "p.search.details.tests", {
url: "/tests",
views: {
"tabContent": {
templateUrl: "app/modules/partials/p/search/details/tests/tests.html",
controller: "DetailsTestsController",
controllerAs: "vm"
}
}
} )
Just to complete the already suggested solution, moving the ui-view outside tab can create css issues (it did in my case), so the solution is to keep ui-view inside tab and add ng-if ui-view div so that in the result, the html contains only one ui-view div.
N.B. : ng-if cannot be replaced by ng-show/ng-hide.
You have
ui-view
in wrong place, which was asking for tab usingvm.tabs()
.As there are 4 tags because of
ng-repeat
rendered div 4 times because it has placed intab
element which are going to repeat usingng-repeat
.As
ui-view
directive renders on page 4 times, that check the browser url and ask for that particular which has 4tabs
that why all the controller with template got called 4 times inside your app.Markup
The solution is, take care where to place your
ui-view
. It must not be within<tab>
I made it using this example and modifying it: http://plnkr.co/edit/efnfjoQ8Hft6AZITCR67?p=preview
And: