У меня есть angularJS приложение с вложенной Ui-зрения, как это (упрощенный вариант):angularjs директива запустить контроллер второй раз
index.html
<html ng-app="admineConsoleApp">
<head> </head>
<body>
<div>
<div ui-view=""></div>
</div>
</body>
</html>
И мой главный обертку, чтобы впрыснуть другие мнения :
main.html
<div id="page-wrapper">
<div ui-view=""></div>
</div>
И мой конфиг:
....
$urlRouterProvider.otherwise('/');
$urlRouterProvider.when('', '/');
$stateProvider
.state('dashboard', {
url: '',
templateUrl: 'views/main.html'
})
.state('dashboard.home', {
url: '/',
controller: 'HomeController as home',
templateUrl: 'views/home.html'
})
....
Все работало хорошо, пока я не использовал директиву для обработки модального всплывающего. Это моя директива:
subscription.directive.js
angular
.module('adminConsoleApp')
.directive('modalDetail', modalDetail);
function modalDetail() {
var directive = {
restrict: 'EA',
scope: {
modalContainer: '=?',
callbackbuttonleft: '&ngClickLeftButton',
callbackbuttonright: '&ngClickRightButton'
},
templateUrl: 'scripts/directives/subscription/modal.subscription.template.html',
transclude: true,
controllerAs: 'home',
controller: 'HomeController',
bindToController: true
};
return directive;
Я также заметил, что каждый функции внутри моего контроллера на самом деле работает в два раза. И, конечно, мне нужен controllerAs
, потому что stateProvider ссылается на псевдоним моего контроллера и потому, что шаблон директивы использует псевдоним контроллера. С этой конфигурацией HomeController
будет выполняться дважды, но если я удалю controllerAs
, директива не будет работать (конечно), но контроллер будет работать только один раз. Это console.log(this);
для моего экземпляра контроллера:
console log for 'this' instance
Если вы заметили, то первый this
сослаться на мой исходный экземпляр контроллера. Второй - только объект с директивной ссылкой. я уже следовал наиболее распространенных решений, таких как:
- удалить
ng-controller
парам внутриdiv
элемент - с/без ручного бутстрапе
- проверка для нескольких директив экземпляра или ссылаться на
Единственное, что я еще не попытался поместить логику контроллера для директивного модального непосредственно внутри самой директивы (я имею в виду: избегайте использования controller: HomeController
и определите новый). Но я хотел бы знать, могу ли я хранить такие вещи, как на самом деле, и применять решение, чтобы избежать повторного запуска контроллера.
Примечание: это поведение вызывает раздражение, но все работает нормально (после второго вызова). Я просто хочу знать хорошее решение, чтобы гарантировать, что директива не запускает контроллер дважды.
Какие функции с вашего контроллера работают дважды? Я уверен, что они находятся в ваших шаблонах и запускаются из-за цикла '$ digest' – maurycy
, например, как я уже сказал,' console.log (this) 'будет срабатывать 2 раза. Если вы нажмете «консольный журнал для этого экземпляра», вы увидите 2 журнала. – zorta86
Я перечитал ваш вопрос, поэтому у вас есть маршрут, который использует 'controller: 'HomeController как home',', и тогда у вас есть директивный контроллер: 'HomeController', 'конечно, ваши функции будут запускаться дважды, контроллеры не являются одноточиями – maurycy