Hello,
I am trying to implement a dynamic tabstrip. Below is the code snippets after which I will try to explain the problem I am facing.
HTML:
<
div
class
=
"text-module"
>
<
div
k-animation
=
"false"
class
=
"basic"
k-options
=
"vm.tabOptions"
k-data-source
=
"vm.tabsToDisplay"
k-data-content-url-field
=
"'contentUrl'"
k-data-text-field
=
"'title'"
ng-model
=
"vm.tabToSelect"
>
</
div
>
</
div
>
Data source collection:
vm.tabsToDisplay = new kendo.data.DataSource();
vm.tabItemsSource = [
{
id: 1,
title:
'Title1'
,
contentUrl:
'/App/Modules/MyModule/Views/a.html'
,
Type:
'X'
,
},
id: 2,
title:
'Title2'
,
contentUrl:
'/App/Modules/MyModule/Views/b.html'
,
Type:
'Y'
,
},
];
Method to change tab source based on let's say a button click (toggle)
function
filterTabsToDisplay() {
//vm.ToggleOption could be either X or Y
vm.filteredTabs = _.filter(vm.tabItemsSource,
function
(tab) {
return
tab.Type === vm.ToggleOption; });
vm.tabsToDisplay.data(vm.filteredTabs);
}
Tab options:
//Below stuff can be removed; exists for logging purpose only
vm.tabOptions = {
select:
function
(e) {
console.log(
"Selected: "
+ e.item.innerText);
},
activate:
function
(e) {
console.log(
"Activated: "
+ e.item.innerText);
},
show:
function
(e) {
console.log(
"Shown: "
+ e.item.innerText);
},
contentLoad:
function
(e) {
console.log(
"Content loaded in "
+ e.item.innerText);
},
error:
function
(e) {
console.log(
"Loading failed with "
+ e.xhr.statusText +
" "
+ e.xhr.status);
}
};
Tab selection:
function
selectTab(tabToSelectId) {
vm.tabToSelect = _.filter(vm.filteredTabs,
function
(tab) {
return
tab.id === tabToSelectId; })[0].title;
}
By default value of "vm.ToggleOption" is X which means 1 tab is shown to user. If I see the network tab when this happens, I see that "a.html" gets loaded dynamically. This page is an html page with angular controller attached. So the controller gets initialized as well. If I toggle to Y, "b.html" is loaded and its controller initialized. Everything is good so far.
Now, If I toggle back to X, "a.html" gets loaded again (I see this in network tab) which means the controller associated with this html gets initialized again. This is a problem because when the second load of "a.html" happens, the controller created during previous load already exists and hence I now have two instances of same controller which for me is a problem. If I continue to switch the toggle, every time, a new controller gets created which is quite problematic.
My question is, is this expected behavior when I use "k-data-content-url-field" option. Is there any way I can control this behavior so that it doesn't load the associated html every time?
Also, I have observed that this happens only when I change the bounded data source in some way (using filterTabsToDisplay method). If I have static tab strip like below, this problem doesn't arise.
<div class=
"text-module"
ng-
if
=
"vm.ToggleOption=='X'"
>
<div kendo-tab-strip k-animation=
"false"
id=
"tabstrip1"
class=
"basic"
>
<ul>
<li class=
"k-state-active"
>
<span>Title1</span>
</li>
</ul>
<div>
<div ng-include=
"'/App/Modules/MyModule/Views/a.html'"
></div>
</div>
<div class=
"text-module"
ng-
if
=
"vm.ToggleOption=='Y'"
>
<div kendo-tab-strip k-animation=
"false"
id=
"tabstrip2"
class=
"basic"
>
<ul>
<li class=
"k-state-active"
>
<span>Title2</span>
</li>
</ul>
<div>
<div ng-include=
"'/App/Modules/MyModule/Views/b.html'"
></div>
</div>
</div>
</div>
</div>
Regards,
Vinod