4

在我的角度項目中,用戶接受一個EULA,然後自動重定向到他們的儀表板,但是,在這個重定向上,DashboardController似乎被調用了兩次,DashboardController被調用我已經檢查過是否意外地在模板中再次調用它,但我沒有。以下是我的路線&控制器。如果我直接訪問URL或通過EULA控制器上的重定向訪問,似乎並不重要,我得到的結果相同。在Ionic(AngularJS)中調用兩次控制器

的路由

.config(function($httpProvider, $stateProvider, $urlRouterProvider) { 

    $httpProvider.interceptors.push('httpRequestInterceptor'); 

    $urlRouterProvider.otherwise('/'); 

    $stateProvider 

    .state('login', { 
     url: '/', 
     templateUrl: 'templates/login.html', 
     data: { 
      requireLogin: false 
     } 
    }) 
    .state('eula', { 
     url: '/eula', 
     templateUrl: 'templates/eula.html', 
     data: { 
      requireLogin: true 
     } 
    }) 
    .state('dashboard', { 
     url: '/groups', 
     templateUrl: 'templates/dashboard.html', 
     data: { 
      requireLogin: true 
     } 
    }) 
}); 

控制器:

App.controller('DashboardController', ['$scope', 'RequestService', '$state', '$rootScope', function($scope, RequestService, $state, $rootScope){ 

alert('test'); 

}]); 

任何想法?

將我的HTML按備註

的index.html

<body ng-app="App"> 

<ion-nav-bar class="bar-positive nav-title-slide-ios7" align-title="center"> 
     <ion-nav-back-button class="button-icon ion-arrow-left-c"></ion-nav-back-button> 
    </ion-nav-bar> 
    <ion-nav-view class="slide-left-right"></ion-nav-view> 
    <ui-view></ui-view> 
</body> 

dashboard.html

<div class="groups" ng-controller="DashboardController"> 
    <ion-view title="App"> 

     <ion-nav-buttons side="right"> 
      <a ui-sref="groupcreate"><span class="icon ion-ios-plus-outline"></span></a> 
     </ion-nav-buttons> 

     <ion-content class="padding"> 
      <div class="row"> 
       <div class="col-50" ng-repeat="group in groups"> 
        {{ group }} 1 
       </div> 
      </div> 
     </ion-content> 
    </ion-view> 
</div> 
+0

也許你只包括.JS在兩次的HTML源意外? –

+0

謝謝,但我已經檢查了這一點,它似乎並不是這種情況,我也使用其他控制器,例如一個LoginController,但這只是被調用一次,我不是100%,但它可以做的事情與路由? – ChrisBratherton

+0

這可能有很多原因。它發生在我上個星期,這是因爲我使用離子和控制器被連接到dom。它也在路由中被觸發。如果你也提供你的html,這可能是原因。看到這個職位的可能解決方案列表 - http://stackoverflow.com/questions/15535336/combating-angularjs-executing-controller-twice –

回答

5

好了,所以以後很長一段時間的調試和檢查的東西了,我發現,這是與導航欄離子的問題,從本質上講,我打電話在同一頁上<ui-view></ui-view> & <ion-nav-view></ion-nav-view>,所以基本上就增加了一倍我的觀點反過來又將控制器稱爲兩次。

8

如果你正在使用ui-router你沒有使用ng-controller。你已經在你的dashboard.html中使用它,另一個是由ui-router生成 - 這就是爲什麼它被擊中兩次。

+0

正如您在上面的路由示例中看到的,我只在儀表板視圖中調用它。我將它從路線中移除以試用它,似乎不管我怎麼稱呼它,它都跑了兩次。 – ChrisBratherton

+0

@SeriousJelly - 我的意思是從dashboard.html中刪除'ng-controller =「DashboardController」 - 當您訪問儀表板路由時,控制器被調用兩次,因爲它在HTML模板中,並且由'ui-router'自動生成。 – Kamo

+1

好吧,試過現在沒有加載,當然ui路由器不知道我想在該模板中使用哪個控制器,除非我在路由本身或視圖(而不是兩者)中指定它。 – ChrisBratherton

1

我知道這已被回答,但我想補充我的修復完全相同的問題。

我的控制器也被稱爲兩次,但對我來說,我在不同的文件中註釋掉ng-controller設置:

主我的配置功能app.js

.config(function($stateProvider, $urlRouterProvider) { 
    $stateProvider 
     .state('splash', { 
      url: "/", 
      templateUrl: "app/splash/splash.html" 
      // controller: 'SplashCtrl' 
     }) 

由於我已經在標記中調用它:

<ion-view view-title="TickerTags" ng-controller="SplashCtrl as splash"> 
    <ion-content class="splash"> 

我的指令

angular 
    .module('tagsPanelDirective', []) 
    .controller('TagsPanelCtrl', TagsPanelCtrl) 
    .directive('tagsPanel', tagsPanel); 

function tagsPanel() { 
    var directive = { 
     templateUrl: "app/tags/tagsPanel.html", 
     restrict: "E", 
     replace: true, 
     bindToController: true, 
     // controller: 'TagsPanelCtrl as tagsPanel', 
     link: link, 
     scope: false 
    }; 
    return directive; 
    function link(scope, element, attrs) {} 
} 

同樣的內部控制器密鑰,因爲我已經從模板標記中調用它:

<section class="tags-panel" ng-controller="TagsPanelCtrl as tagsPanel">