Подтвердить что ты не робот

Функции разрешения UI-Router вызываются только один раз

Я собирался использовать функцию разрешений ui-routers, чтобы вставлять некоторые исправленные решения promises в мои контроллеры.

Я использовал пример plnkr, чтобы сделать пример. Рассмотрим эти вложенные состояния: route1 и route1.list. У меня есть функция разрешений abc, определенная на route1. Теперь, когда я впервые перейду к route1, вызывается abc и будет разрешен. Теперь, когда я перехожу к route1.list и обратно к route1, abc не вызывается снова.

http://plnkr.co/edit/mi5H5HKVAO3J6PCfKSW3?p=preview

Я предполагаю, что это намеренно, но рассмотрим этот прецедент: функция разрешения получает некоторые данные через http и должна быть обновлена ​​/недействительна в какой-то момент, возможно, при каждом изменении состояния. Есть ли способ сделать это при использовании вложенных состояний? Если функция разрешения была вызвана при каждом инъекции, я мог бы реализовать ее любым способом: вернуть старое, разрешенное обещание или создать новый.

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

4b9b3361

Ответ 1

Поставка опции reload:true в go()/transtionTo()/ui-sref делает трюк:-) Спасибо Designing the Code за то, что указали мне в этом направлении. Решение немного другое, поэтому я напишу этот ответ.

Перезагрузка документирована следующим образом:

reload (v0.2.5) - {boolean = false}, Если true приведет к силовому переходу, даже если состояние или параметры не изменились, а также перезагрузка одного и того же состояния. Он отличается от reloadOnSearch, потому что вы будете использовать его, когда хотите принудительно перезагрузить, когда все будет одинаково, включая параметры поиска.

Прямым способом является изменение любой ссылки ui-sref на следующее: <a ui-sref="route1" ui-sref-opts="{reload: true}">.

Чтобы избежать предоставления опции по каждой ссылке, я написал декоратор вокруг $state (см. также http://plnkr.co/edit/mi5H5HKVAO3J6PCfKSW3?p=preview):

 myapp.config(function($provide) {
  $provide.decorator('$state', function($delegate) {
    var originalTransitionTo = $delegate.transitionTo;
    $delegate.transitionTo = function(to, toParams, options) {
      return originalTransitionTo(to, toParams, angular.extend({
        reload: true
      }, options));
    };
    return $delegate;
  });
});

Ответ 2

Попробуйте $state.reload();

Это снова решит решение. Хотя думаю, что есть некоторые проблемы, связанные с этим, когда контроллеры не перезагружаются. (здесь ui.router n00b)