Let's start with a question in your code. You generate a query string through a function that is actually only called inside the update function
$scope.update = function(data) { $scope.str = generateQueryParameters($scope.str, "no", $scope.no); console.log($scope.str); }; $scope.check = function() { $scope.no = 2; console.log($scope.str); };
You change the version number in the check function, but without calling the function again to change $scope.str , so the value of $scope.str remains the same.
You can easily verify this by following these steps in your snippet:
Click on update (v0)
Click on check (v0)
But then click again on the update, and you will see that it is now updated (v2)
So in step 2 you actually change the version, you just don't generate str again for use.
So it's easy to fix your code - just streamline the code to call a function to assign a new str every time you change your version:
$scope.update = function(data) { $scope.no = 1; $scope.str = generateQueryParameters($scope.str, "no", $scope.no); console.log($scope.str); }; $scope.check = function() { $scope.no = 2;
Otherwise, you need to monitor the no version parameter and automatically update the str value each time the version changes. But this solution implies that you will have an observer in each controller where you call the API, as well as all parameters that are always hardcoded inside the controllers:
$scope.$watch('no', function() { $scope.str = generateQueryParameters($scope.str, 'no', $scope.no); });
Even if this solution works, it actually sucks. The call control logic is inside the controllers, which is a very bad practice (for this you should think about a centralized service).
Much better, in AngularJS you can use a custom interceptor and manage there all the actions that you need to perform regarding HTTP requests. Thus, you can specify the version of the API that you want to use as the parameter of the HTTP request.
This will keep your code clean. Moreover, if you want to change a query in the future, you can simply change this query parameter. If you want to change all requests, inside the interceptor you can simply set that all requests to version 1 will be replaced by version 2 .
Here is a sample code on how to detect an interceptor:
angular.module('myApp').factory('MyHTTPFactory', MyHTTPFactory) .config(function($httpProvider) { // register the new interceptor in AngularJS $httpProvider.interceptors.push('MyHTTPFactory'); }); MyHTTPFactory.$inject = []; function MyHTTPFactory() { // this is the base URL of your rest requests, so this interceptor will be applied only to the requests directed to your service const MY_REST_URL = 'blablabla'; // methods exposed by the service let factory = { request: request, requestError: requestError, response: response, responseError: responseError }; return factory; // ============================================================ function request(config) { if (config.url.includes(MY_REST_URL)) { let versionToUse = config.version; // here use a function for elaborating your query string, directly in the interecptor code config.url = elaborateQueryString(); } return config; } function requestError(config) { return config; } function response(res) { return res; } function responseError(res) { return res; } // function for getting the query string you want to function elaborateQueryString() { // elaborate your requests } }
Then simply execute as always HTTP requests via $http adding as the parameter the version that you want to use inside the request:
// perform your request as usual simply specifying the new version parameter let request = { url: 'myserviceurl', version: '2' // or whatever you qNR }; $http(request);
Thus, the interceptor will βanalyzeβ all your requests before execution, it will correctly compile the version and query string the way you want, and all your operations will be controlled and centralized.
Just like the last tip, when defining constants, such as version numbers, the endpoint of the rest of the services uses constant AngularJS and enters them where you need to use them. Hard-coded strings are not good practice.