2015-06-10 2 views
0

Я слушаю $ routeChangeSuccess внутри контроллера:

// In MyController 
$scope.$on("$routeChangeSuccess", (a, b, c) => { 
      console.log(a, b, c); 
}); 

Это прекрасно работает, когда изменение маршрута в результате навигации в пределах приложения, но не всегда при переходе непосредственно к URL в браузере, например/Мой новый-гиперссылка

Производительность зависит от того, где определяется контроллер:

<div ng-controller="MyController"></div> 

Если это в основном index.html, кажется, работает каждый раз, однако:

<mydirective ng-controller="MyController"></mydirective> 

с:

app.directive('myDirective', function() { 
    return { 
    templateUrl: '<SOME_CONTENT>' 
    } 
}); 

или действительно:

<mydirective></mydirective> 

и:

app.directive('myDirective', function() { 
    return { 
    controller: "MyController", 
    templateUrl: '<SOME_CONTENT>' 
    } 
}); 

Эти последние два слышать только $ routeChangeSuccess около 50% времени - предположительно, из-за какой-то компиляции/переваривать состояние гонки.

Я бы предпочел установить мой контоллер в определении директивы - он опрятен, кажется красиво модульным, и нет лишней разметки. К сожалению, это просто не работает очень часто.

Как примечание стороны: почему я хочу это сделать?

Я борюсь с шаблоном дизайна приложения, которым Angular кажется отказывать играть в мяч. У меня есть несколько отдельных модулей в моем приложении, они все живы в одно и то же время, и я хочу, чтобы они ответили к изменениям URL соответствующим образом.

Я действительно не понимаю, почему этого так трудно достичь. $ routeProvider не очень полезен, потому что у меня может быть только один просмотр/контроллер для каждого маршрута - это здорово, если я хочу создать веб-сайт с одной страницей, но не в том случае, если я пытаюсь создать одностраничное приложение со сложным пользовательским интерфейсом , Плагин ui-router на самом деле не то, что я ищу - это больше о состояниях с дополнительными маршрутами.

Это веб-адрес - ссылка священна! Я хочу почитать его и использовать его как можно больше, и я хочу, чтобы каждый компонент или модуль в моем приложении знал, что он должен делать на основе URL. Я не знаю, почему так сложно с Угловым.

ответ

0

Для того чтобы любой компонент мог поймать событие, этот компонент должен быть загружен в память, когда четный сигнал поднят.

Если вы использовали команды ng-view и контроллеры \ директивы определены как частичные, которые загружаются в ng-view, то вам уже поздно подписаться и прослушать событие. Контроллер, который загружается, когда частичные файлы загружаются внутри ng-view, не готов обрабатывать событие к моменту его поднятия.

Все, что находится за пределами ng-view, является глобальным по природе и всегда может подписаться на такие мероприятия.

+0

Спасибо за это - я начинаю понимать причины моей проблемы. Я неправильно думаю о структуре своего приложения? Можете ли вы предложить лучший способ сделать то, что я пытаюсь сделать? – user888734

+0

Независимо от того, что загружено внутри 'ng-view', можно считать имеющим срок службы маршрута, на котором он зависит. Если у вас есть количество модулей, которые живы, они не могут быть связаны с просмотром. Это могут быть сервисы n. Может быть, конкретный пример от вас может помочь. – Chandermani

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