2016-09-13 2 views
2

У меня есть 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 и определите новый). Но я хотел бы знать, могу ли я хранить такие вещи, как на самом деле, и применять решение, чтобы избежать повторного запуска контроллера.

Примечание: это поведение вызывает раздражение, но все работает нормально (после второго вызова). Я просто хочу знать хорошее решение, чтобы гарантировать, что директива не запускает контроллер дважды.

+0

Какие функции с вашего контроллера работают дважды? Я уверен, что они находятся в ваших шаблонах и запускаются из-за цикла '$ digest' – maurycy

+0

, например, как я уже сказал,' console.log (this) 'будет срабатывать 2 раза. Если вы нажмете «консольный журнал для этого экземпляра», вы увидите 2 журнала. – zorta86

+0

Я перечитал ваш вопрос, поэтому у вас есть маршрут, который использует 'controller: 'HomeController как home',', и тогда у вас есть директивный контроллер: 'HomeController', 'конечно, ваши функции будут запускаться дважды, контроллеры не являются одноточиями – maurycy

ответ

0

SOLVED: просто переопределите внутреннюю директиву внутреннего контроллера и вместо этого используйте другой контроллер. Что-то вроде этого:

function modalDetail() { 
    var directive = { 
     restrict: 'EA', 
     scope: { 
      modalContainer: '=?', 
      callbackbuttonleft: '&ngClickLeftButton', 
      callbackbuttonright: '&ngClickRightButton' 
     }, 
     templateUrl: 'scripts/directives/subscription/modal.subscription.template.html', 
     transclude: true, 
     controller: function() { 
      // your implementation here 
     } 
    }; 

    return directive; 

} 

Конечно, измените ссылки шаблона params, чтобы заставить его работать.

1

В угловом режиме использование одного и того же контроллера является независимым экземпляром. Функция контроллера - это просто конструктор контроллера.

Весь код, который должен запускаться только один раз, должен размещать блоки запуска и конфигурации (и mb разрешает ui-router и сервисы (используя какой-либо кеш)).

Невозможно избежать дублирования кода контроллера в вашей ситуации.

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