Контроллер получает вызов дважды из-за добавления параметров в URL-адрес

Я в angularjs. Я пытаюсь добавить параметр в url, используя $location.search('sid', key);. Значение ключа поступает с другого сервера по запросу http. Вот код для параметра append.

.config(['$routeProvider',function ($routeProvider) {
        $routeProvider
            .when('/', {
                templateUrl: 'test1.html',
                controller: 'test1Controller'
            })
            .when('/message/:userId', {
                templateUrl: 'test2.html',
                controller: 'test2Controller'
            })
            .otherwise({
                redirectTo: '/'
            });
    }])
.run(['$route', '$rootScope', '$location' ,'getAuthDetails', function($route, $rootScope, $location,getAuthDetails) {
        var key;

        getAuthDetails.get().then(function(data){
            key = data.key;
            $rootScope.query = 'sid='+key;
            console.log($location.$$path);
            $location.search('sid', key);  //append parameter. This is calling controller twice
        });

        $rootScope.$on('$routeChangeSuccess', function () {
            $rootScope.query = 'sid='+key;
        });
    }]);

У меня есть проблема. Поскольку sid добавляется в url. console.log я помещается в test1Controller, вызывается дважды. Sid используется для соединения с разъемом.

Существует ли какое-либо обходное решение для вызова контроллера после добавления URL-адреса.

Ответ 1

Вы можете использовать reloadOnSearch: false

Пример:

.config(['$routeProvider',function ($routeProvider) {
        $routeProvider
            .when('/', {
                templateUrl: 'test1.html',
                controller: 'test1Controller',
                reloadOnSearch: false // wont reload the controller when the search query changes
            })
            .when('/message/:userId', {
                templateUrl: 'test2.html',
                controller: 'test2Controller'
            })
            .otherwise({
                redirectTo: '/'
            });
    }])

Ответ 2

Убедитесь, что вы пишете контроллер только один раз. напишите либо в ng-контроллере, либо в вашем config-пути:

app.config(['$routeProvider', function($routeProvider){
    $routeProvider.when('/',
        { 
            templateUrl: 'pages/home.html'
            //Remove controller from here
        });
    }]);

home.html

<!-- Add the ng-controller in your view -->
<div ng-controller="MyItemsController">
    <!-- Your stuff -->
</div>

Попробуйте использовать reloadOnSearch: false внутри вашей конфигурации, это предотвратит загрузку контроллера.