несколько просмотров и изменение URL

#angularjs

#angularjs

Вопрос:

В моем варианте использования есть три, за неимением лучшего слова, «представления». Содержимое, отображаемое в третьем представлении, зависит от выбора, сделанного во втором и первом представлении. Аналогично, подтемы, отображаемые во втором представлении, зависят от выбора, сделанного в первом представлении.

 Select Topic | Select Subtopic | Display Content
------------------------------------------------------
Vegetables   | Apple           | The peach is a tasty
FRUITS*      | Banana          | fruit that has a nice
Meats        | PEACH*          | color, etc.
Fish         |                 |
  

В настоящее время, когда пользователь выбирает тему, я получаю и отображаю список подтем. Как только пользователь выбирает подтему, я затем получаю и отображаю содержимое. Пока все идет хорошо.

Единственная проблема, я также хочу, чтобы пользователь мог получить к этому доступ, перейдя по URL-адресу формы:

 example.com/index.html#/topic/subtopic
  

У меня это работает таким образом, что переход по URL-адресу приводит к загрузке всего нужного содержимого. Проблема не в этом.

Моя проблема в том, что я хочу изменить URL-адрес, если пользователь выбирает новую тему или подтему. Но без перезагрузки страницы (что, похоже, происходит, если я использую location.path . Как мне это сделать?

Комментарии:

1. Используете ли вы какие-либо функции маршрутизации?

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

3. Зачем использовать location.path ? Вы имеете в виду $location.path() ?

4. @Ben: Вы взглянули на мой ответ ниже?

Ответ №1:

Вы должны использовать не window’s location.path , а маршрутизацию Angular (либо через $location.path() , либо неявно изменяя #hash).

С такими представлениями:

 <!-- Categories -->
<script type="text/ng-template" id="partials/categories.tmpl.html">
    <h3>Select a food category:</h3>
    <ul>
        <li ng-repeat="category in categories">
            <a ng-href="#/{{category.path}}">{{category.label}}</a>
        </li>
    </ul>
</script>

<!-- Fruits -->
<script type="text/ng-template" id="partials/fruits.tmpl.html">
    <h3>Select a fruit:</h3>
    <ul>
        <li ng-repeat="fruit in fruits">
            <a ng-href="#/fruits/{{fruit.path}}">{{fruit.label}}</a>
        </li>
    </ul>
    <a ng-href="#/{{back}}">Back</a>
</script>

<!-- Meats --->
...

<!-- Vegetables -->
...

<!-- Description -->
<script type="text/ng-template" id="partials/description.tmpl.html">
    <h3>{{item}}</h3>
    <p>{{description}}</p>
    <a ng-href="#/{{back}}">Back</a>
</script>
  

соответствующие контроллеры и службы и конфигурация, подобная этой:

 function config($routeProvider) {
    $routeProvider.
        when('/', {
            templateUrl: 'partials/categories.tmpl.html',
            controller:  'categoriesCtrl'
        }).
        when('/fruits/:fruit?', {
            templateUrl: function (params) {
                return params.fruit ?
                        'partials/description.tmpl.html' : 
                        'partials/fruits.tmpl.html';
            },
            controller:  'fruitsCtrl'
        }).
        when('/meats/:meat?', {...}).
        when('/vegetables/:vegetable?', {...}).
        otherwise({
            redirectTo: '/'
        });
}
  

вы можете добиться того, чего хотите!


Смотрите также эту короткую демонстрацию.

Ответ №2:

Насколько я знаю, единственный способ добиться именно этого — использовать ui-router.

С помощью ngrouter вам нужно изменить свои параметры для параметров строки запроса, чтобы это было похоже:

 example.com/index.html#/myRoute?topic=topicamp;subtopic=subtopic
  

А затем в вашей конфигурации маршрутов:

 when('/myRoute', { templateUrl: ..., reloadOnSearch: false })
  

Затем вы должны прослушать изменения в маршруте ($routeChangeSuccess) на контроллере и получить оттуда строку запроса.