Контроллер не обновляется при изменении состояния ui-sref

Предисловие

Щелчок по ссылкам ui-sref не обновляет контроллер именованных представлений.

Вопрос

Как обновить WeeklyCtrl при нажатии на ui-sref="root.store.page.ad({ adSlug: promo.code })" из SidePanelCtrl

обратите внимание на перезагрузку страницы. Я вижу, как мигает значок значка, но нет повторной инициализации каких-либо контроллеров routes.js

$stateProvider
  .state('root', {
    url: '/',
    abstract: true,
    views: {
      '': {
        templateUrl: 'views/main.html',
        controller: 'MainCtrl'
      }
    }
  })
  .state('root.store', {
    url: ':storeSlug',
    views: {          
      'sidepanel': {
        templateUrl: 'views/partials/side-panel.html',
        controller: 'SidePanelCtrl'
      },
      'weekly': {
        templateUrl: 'views/partials/weekly.html',
        controller: 'WeeklyCtrl'
      },
    }
  })
  .state('root.store.page', {

    url: '/page',

  })
  .state('root.store.page.ad', {
    url: '/:adSlug',


  })

index.html

<div ui-view=""></div>

main.html

  <div ui-view="weekly"></div>
  <div ui-view="sidepanel"></div>

боковая панель.html

<a ng-repeat="promo in promos" ui-sref="root.store.page.ad({ adSlug: promo.code })"  >
    <h3>...</h3>
</a>

Когда WeeklyCtrl инициализируется, он запускает вызов API для запуска.

Pages.details.getPages($scope).success(function(data){
    console.log(data);
});

В конце концов, я хочу, чтобы это срабатывало снова, когда я переключаюсь между промо.

ОБНОВЛЕНИЕ:

При нажатии на ссылку: API отвечает 3 раза. контроллер повторно инициализируется несколько раз 3 times


person Armeen Harwood    schedule 22.08.2014    source источник


Ответы (1)


Я думаю, это поведение по умолчанию. Если вы также хотите обновить контроллер, добавьте эту функцию в свой контроллер:

$scope.boom = function(promoCode){
      $state.transitionTo("root.store.page.ad", 
          { adSlug: promoCode }, { notify: true }); 
};

и на ваш взгляд:

<a ng-repeat="promo in promos" 
    ng-click="boom(promo.code);$event.preventDefault();"  >
    <h3>...</h3>
</a>

Если вам это не нравится, загрузите исходный код ui-sref и создайте на его основе новую директиву с именем ui-sref-ctrl.

Так устроен ui-router.

Контроллер загружается только тогда, когда он находится в другом состоянии. ui-router не будет повторно запускать контроллер и не переоценивать шаблон представления. Даже если вы используете один и тот же контроллер в нескольких состояниях и переключаетесь между ними, контроллер не запустится повторно.

ui-sref делает не обновлять пользовательский интерфейс (его контроллер не перезапускается) при двойном нажатии на ссылку

person Erti-Chris Eelmaa    schedule 22.08.2014
comment
Эй, не могли бы вы узнать, основываясь на моих маршрутах, почему контроллер обновляется 3 раза? обновление изображения выше. - person Armeen Harwood; 22.08.2014
comment
хм не было такой проблемы. Используйте отладчик Chrome и поставьте точку останова на инициализацию контроллера и посмотрите, что происходит в стеке вызовов (например, кто генерирует эти инициализации). - person Erti-Chris Eelmaa; 22.08.2014