diff --git a/public/app/features/templating/templateValuesSrv.js b/public/app/features/templating/templateValuesSrv.js index fb751a2ce3a..9ecb02f0a0b 100644 --- a/public/app/features/templating/templateValuesSrv.js +++ b/public/app/features/templating/templateValuesSrv.js @@ -10,6 +10,7 @@ function (angular, _, kbn) { module.service('templateValuesSrv', function($q, $rootScope, datasourceSrv, $location, templateSrv, timeSrv) { var self = this; + this.variableLock = {}; function getNoneOption() { return { text: 'None', value: '', isNone: true }; } @@ -90,6 +91,8 @@ function (angular, _, kbn) { } else { lock.resolve(); } + }).finally(function() { + delete self.variableLock[variable.name]; }); }; @@ -124,7 +127,7 @@ function (angular, _, kbn) { templateSrv.setGrafanaVariable('$__auto_interval', interval); }; - this.setVariableValue = function(variable, option, initPhase) { + this.setVariableValue = function(variable, option) { variable.current = angular.copy(option); if (_.isArray(variable.current.text)) { @@ -134,13 +137,7 @@ function (angular, _, kbn) { self.selectOptionsForCurrentValue(variable); templateSrv.updateTemplateData(); - // on first load, variable loading is ordered to ensure - // that parents are updated before children. - if (initPhase) { - return $q.when(); - } - - return self.updateOptionsInChildVariables(variable); + return this.updateOptionsInChildVariables(variable); }; this.variableUpdated = function(variable) { @@ -149,6 +146,11 @@ function (angular, _, kbn) { }; this.updateOptionsInChildVariables = function(updatedVariable) { + // if there is a variable lock ignore cascading update because we are in a boot up scenario + if (self.variableLock[updatedVariable.name]) { + return $q.when(); + } + var promises = _.map(self.variables, function(otherVariable) { if (otherVariable === updatedVariable) { return;