2015-10-12 8 views
0

В моем угловом приложении, у меня есть следующая структура маршрута:Угловой UI-маршрутизатор: государственный контролера ребенок не вызывался

.state('mapping', { 
    url: '/mapping', 
    templateUrl: 'app/components/mapping/mapping.html', 
    controller: 'MapCtrl as map', 
    abstract: true, 
    authenticate: true 
}) 
.state('mapping.all', { 
    url: '', 
    templateUrl: 'app/components/mapping/partials/all.html', 
    authenticate: true 
}) 
.state('mapping.project', { 
    url: '/:projectName', 
    templateUrl: 'app/components/mapping/partials/project.html', 
    controller: 'ProjectCtrl as proj', 
    authenticate: true 
}) 

При доступе к mapping состояния, mapping.all нагрузка по умолчанию. Это в основном показывает список проектов, которые ссылаются на состояние mapping.project, как таковой:

<a ui-sref="mapping.project({projectId: project.id, projectName: project.name})">...</a> 

Я хочу, чтобы вызвать ProjectCtrl когда доступ mapping.project для того, чтобы загрузить необходимые данные, но он даже не загружается , В этом фрагменте, ниже которого включает в себя только соответствующие данные, то alert сообщение никогда не выскочит:

angular 
    .module('watera') 
    .controller('ProjectCtrl', Controller); 

Controller.$inject = ['$stateParams', 'UserFactory', 'ProjectFactory']; 

function Controller($stateParams, UserFactory, ProjectFactory) { 
    var proj = this; 

    activate(); 

    function activate() { 
     alert('1'); 
    } 
} 

Файл JS правильно связан и контроллер назван правильно. <div ui-view></div> элемент расположен внутри mapping.html, как показано ниже:

<div id="ribbon" class="no-print"> 
    <div class="container-fluid"> 
     <div class="row"> 
      <div class="col-xs-12"> 
       <strong>Mapping</strong> 
       <p class="text-muted">In this section...</p> 
      </div> 
     </div> 
    </div> 
</div> 

<div ui-view></div> 

Почему этот контроллер не загружается?

EDIT: Он получает страннее, я переключил структуру:

.state('mapping', { 
    url: '/mapping', 
    templateUrl: 'app/components/mapping/mapping.html', 
    abstract: true, 
    authenticate: true 
}) 
.state('mapping.all', { 
    url: '', 
    templateUrl: 'app/components/mapping/partials/all.html', 
    controller: 'MapCtrl as map', 
    authenticate: true 
}) 
.state('mapping.project', { 
    url: '/:projectName', 
    templateUrl: 'app/components/mapping/partials/project.html', 
    controller: 'ProjectCtrl as proj', 
    authenticate: true 
}) 

MapCtrl И пока продолжает работать правильно, ProjectCtrl до сих пор нет.

+0

try 'controller: 'MapCtrl', controllerAs: 'map'' вместо' controller:' MapCtrl as map'' – guramidev

+0

MapCtrl отлично работает, его ProjectCtrl не загружает. – Tiago

ответ

1

Найдено вопрос ... Были два экземпляра ProjectCtrl в этом проекте:

enter image description here

Видимо , это вызывает какой-то тихий конфликт, потому что ошибки консоли не было абсолютно. Поскольку второй экземпляр также был связан на index.html, после тот, который я хотел загрузить, вероятно, это просто замена правильной версии. Отладка кошмаров.

Исправлено.

+2

Хорошо, что вы сделали это! Наслаждайтесь могучим UI-маршрутизатором –

+0

Еще раз спасибо за вашу огромную помощь и извините за неудобства вам три раза с той же проблемой. Может быть, это даже не будет последним ... – Tiago

0

Абстрактное состояние не может существовать по определению, поэтому с URL-адресом шаблона для родителя и детей (который не будет наследовать шаблон-родительский родительский элемент, потому что дети определяют их собственные) является весьма сомнительной ИМО.

Им также интересно, если есть проблемы distinguising между ... URL: '' И URL: '/: Projectname'

(Хотя он должен обрабатывать различия). Однако, чтобы убедиться, что я предлагаю пошаговый подход. Стартует с последующим отображением я предлагаю, а затем усилить его оттуда ...

.state('mapping', { 
    abstract: true, 
    authenticate: true 
}) 
.state('mapping.all', { 
    url: '/', 
    templateUrl: 'app/components/mapping/partials/all.html', 
    controller: 'MapCtrl as map', 
}) 
.state('mapping.project', { 
    url: '/project/:projectName', 
    templateUrl: 'app/components/mapping/partials/project.html', 
    controller: 'ProjectCtrl as proj', 
}) 
+0

Я действительно верю, что абстрактное состояние все еще нуждается в URL, хотя я ошибаюсь? – Tiago

+1

Все, что определено в абстрактном состоянии (например, URL), просто позволяет детям наследовать это свойство - например, если они не определяют свой собственный URL-адрес, они получают свой URL-адрес от родителя.Поскольку они определяют свой собственный URL-адрес, нет смысла определять URL-адрес в абстрактном состоянии – danday74

+0

Я понимаю, но в шаблонеUrl есть смысл включить хотя бы ui-view, правильно? – Tiago

Смежные вопросы