Контроллер загружается дважды с помощью пользовательского интерфейса ui-router + custom

Я пытаюсь принести на свою домашнюю страницу пользовательскую директиву, которая выведет мне некоторые результаты. На вкладке сети в моем devtools я только что увидел, что мой контроллер загружается дважды.

контроллер:

var homeController = function($log,leaguesFactory){
        var self = this;
        self.leagues = [];

            leaguesFactory.loadLeagues()
                .then(function(leagues){
                    self.leagues = leagues.data.Competition;
                });
        self.message= 'test message';
};

директива:

var leaguesTabs = function(){
        return {
            restrict : 'E',
            templateUrl : 'app/home/leagues-tabs.tpl.php',
            scope: {
                leagues: '='
            },
            controller: 'homeController',
            controllerAs: 'homeCtrl'
        };
};

UI-роутер сообщает:

$stateProvider
            .state('home',{
                url : '/',
                templateUrl : 'app/home/home.tpl.php',
                controller : 'homeController',
                controllerAs: 'homeCtrl'
            })...

Я просто хочу использовать мой homeCtrl в директиве, но кажется, что провайдер состояний загружает его и заставляет загружаться дважды. Если я удаляю контроллер из директивы, я не получаю доступ к homeCtrl, если я удаляю homeCtrl из stateprovider, чем у меня нет доступа в home.tpl.php

home.tpl.php:

<div>
    <leagues-tabs></leagues-tabs>
</div>

любая идея?

2 ответа

Собственно проблема связана со следующими шагами:

  • UI-роутер начинает обрабатывать URL '/'
  • ui-router создайте экземпляр 'homeController'
  • ui-router отображает представление 'app / home / home.tpl.php'
  • Angular видеть использование пользовательской директивы - 'league-tabs'
  • Директива 'league-tabs' создает экземпляр 'homeController'
  • "Лиги-вкладки" отображают представление "app / home / home.tpl.php"

Вы можете выбрать любое из следующих возможных решений:

  • Измените контроллер для "лиг-вкладок" на что-то особенное
  • Удалить использование контроллера из определения состояния ui-router

Вы можете попробовать это http://plnkr.co/edit/LG7Wn5OGFrAzIssBFnEE?p=preview

Приложение

    var app = angular.module('app', ['ui.router', 'leagueTabs']);

UI Router

    app.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
        $urlRouterProvider.otherwise('/leagues');
        $stateProvider
            .state('leagues', {
                url: '/leagues',
                templateUrl: 'partial-leagues.html',
                controller: 'LeaguesController',
                controllerAs: 'ctrl'
            });

    }]);

контроллер

    app.controller('LeaguesController', ['$http', function($http) {
        var self = this;
        $http.get('leagues.json').success(function(data){
            self.leagues = data;
        })
    }]);

Посмотреть

    <div>
      <league-tabs leagues="ctrl.leagues"></league-tabs>
    </div>

директива

    var leagueTabs = angular.module('leagueTabs', []);
    leagueTabs.directive('leagueTabs', function(){
        return {
            restrict : 'E',
            templateUrl : 'partial-league-tabs.html',
            scope: {
                leagues: '='
            },
            controller: 'LeagueTabsController',
            controllerAs: 'leagueTabs'
        }
    });
    leagueTabs.controller('LeagueTabsController', function($scope){
        var self = this
        $scope.$watch('leagues', function(leagues){
            self.leagues = leagues;
        })
    })

Директивный вид

    <div>
       <ul ng-repeat="league in leagueTabs.leagues">
         <li>{{league.name}}</li>
       </ul>
    </div>
Другие вопросы по тегам