2015-12-23 36 views
1

我有一個使用AngularJS和bootstrap的應用程序,導致我出現了一些問題。AngularJS函數在路由更改時被錯誤地調用

app.config(function($routeProvider) { 
    $routeProvider.when("/", { 
    templateUrl: "index.html", 
    controller: "controllerIndex" 
    }).when("/pageone", { 
    templateUrl: "pageone.html", 
    controller: "controllerPageOne" 
    }).when("/pagetwo", { 
    templateUrl: "pagetwo.html", 
    controller: "controllerPageTwo" 
    }); 
    return $routeProvider.otherwise({ 
    templateUrl: "error.html" 
    }); 
}); 

在我pagetwo選項卡,我有兩個標籤:

<tabset> 
    <tab heading="Metrics" active="tabs[0]" select="changeTab(0)"> 
    <tab heading="Admin LDAP Search" active="tabs[1]" select="changeTab(1)"> 
</tabset> 

正如你可能會說,我一直在使用功能的主導航是通過標籤和路由配置如下完成changeTab和「active」屬性來嘗試使應用程序記住在此頁面上選擇的選項卡,即使路由發生變化。在controllerPageTwo,相關代碼是:

$scope.getCurrentTab = tabTracker.getCurrentTab() 
$scope.tabs = tabTracker.getTabs() 

$scope.changeTab = (tab) -> 
    tabTracker.setCurrentTab(tab) 

這個想法是,當路線變更/ pagetwo,電流(有源)標籤和標籤的陣列將來自服務,tabTracker被拉動。然後,通過將適當的數組值設置爲true,將另一個設置爲false,將選項卡更改爲該選項卡。這按預期工作,並在按預期更改標籤時調用。

但是,任何時候路由改變FROM/pagetwo,changeTab都會被調用,值爲1.這意味着無論如何,當路由發生變化時,第二個標籤將返回到此頁面上的活動標籤。

爲什麼用這個最大值調用它? (我用三個標籤搞亂了,並且有同樣的問題,但它會用值2來調用它)。我知道有時代碼在控制器中運行了兩次,但除了index.html之外,我沒有任何地方提及ng-controller。

讓我知道如果你需要更多的信息,我試圖包括所有相關的東西,沒有它太長。

回答

1

你想用的

ng-click="changeTab(0)" 

代替

select="changeTab(0)" 

在編譯階段,後者可能調用函數。

編輯

如果您使用AngularUI,你有正確的語法,但指令應該是

<uib-tabset> 

<uib-tab> 
+0

這似乎是它!我看到了兩個正在使用的stackoverflow的一些不同的例子,所以我不確定。謝謝! – elykl33t

1

它不應該發生。您可以在changeTab中設置一個斷點,並通過參數1找到誰正在調用此方法。

+0

肖恩正好在上面,它正在使用select。通過調試器(我已經設置了斷點,但我不知道如何查看它的調用方式),我看到了一些對select的引用,最終導致問題出現。謝謝! – elykl33t

相關問題