Передача дополнительных параметров с помощью $routeProvider

#angularjs #angular-ui-router #angularjs-routing

#angularjs #angular-ui-router #angularjs-маршрутизация

Вопрос:

В моем приложении AngularJS у меня есть один шаблон и один контроллер, к которым я могу получить доступ через 2 разных URL:

 $routeProvider.when('/site/contents/:obj/:parent/:isnew?', {
    templateUrl: '/partials/site/data.html',
    resolve: {
        loggedin: checkLoggedin
    }
});

$routeProvider.when('/site/contents/new-obj', {
    templateUrl: '/partials/site/data.html',
    resolve: {
        loggedin: checkLoggedin
    }
});
  

Второй маршрут должен статически устанавливать параметр isnew= 1, как я бы сделал, используя RewriteRule в apache, но просматривая документацию https://docs.angularjs.org/api/ngRoute/provider /$routeProvider кажется, это невозможно сделать.

Кто-нибудь сталкивался с тем же вопросом?

Ответ №1:

Вы не можете установить параметры маршрута по умолчанию в Angular, если это то, что вы пытаетесь сделать.

Вероятно, лучшей идеей было бы проверить ваш контроллер, если $routeParams.isnew он установлен, и, если нет, по умолчанию он равен 1.

Предполагается, что угловые маршруты должны быть довольно простыми, а не основываться на шаблонах, как RewriteEngine в apache, поэтому логика должна быть в вашем контроллере.

Ваш контроллер может выглядеть так:

 function($routeParams) {
    $scope.isNew = ($routeParams.isnew || 1);
}
  

В вашем случае вам, вероятно, даже может сойти с рук отсутствие isnew параметра. Используйте первый маршрут для изменения существующих объектов, а второй — для их создания (поэтому наличие obj в параметрах определяет, является ли он новым или нет).

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

1. Ну, это не так просто, потому что даже в первом маршруте я мог бы иметь isnew != 1 вот почему я использую этот параметр. В настоящее время я удалил второй маршрут и использую только один маршрут, передающий строку «(empty)» в качестве параметра obj, но это не то, что я называю «чистым» решением, потому что мне не нравится иметь «правила» или соглашения внутри моего кода.

2. Используется ли ваш первый маршрут для создания объекта, связанного с этим конкретным obj и parent , в то время как второй создает объект, связанный ни с чем? Логика в вашем контроллере все равно будет верной, в любом случае.

3. Первый маршрут используется, когда пользователь уже выбрал все нужные мне параметры, второй маршрут используется, когда пользователь еще не выбрал эти параметры, и он / она сделает это прямо на странице (data.html ). Возможно, решением было бы проверить, является ли obj пустым, в этом случае isnew будет неявно true . Опять же, это не то, что я назвал чистым решением.

4. наиболее правильным решением тогда было бы проверить в вашем контроллере, были ли выбраны указанные параметры (так, obj и parent ?). Если нет, это совершенно новый, и они должны их ввести. Одно или два условия на самом деле не сделают его «грязным».

5. Ну, да, это не совсем «грязно», просто я имел в виду, что я сделал, используя механизм перезаписи. Спасибо, что поделились своими мыслями.