Skip to content

Commit

Permalink
When using config's $bind method, the watcher should be removed autom…
Browse files Browse the repository at this point in the history
…atically when the $scope is destroyed
  • Loading branch information
Spencer Alger committed Feb 25, 2014
1 parent a3aa89d commit 2cc7c13
Showing 1 changed file with 24 additions and 4 deletions.
28 changes: 24 additions & 4 deletions src/kibana/services/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,19 +87,39 @@ define(function (require) {
if (!watchers[key]) watchers[key] = [];
watchers[key].push(onChange);
_notify(onChange, vals[key]);
return function un$watcher() {
_.pull(watchers[key], onChange);
};
}

function $bindToScope($scope, key, opts) {
$watch(key, function (val) {
var configWatcher = function (val) {
if (opts && val === void 0) val = opts['default'];
$scope[key] = val;
});
};

var first = true;
unwatchers.push($scope.$watch(key, function (newVal) {
var scopeWatcher = function (newVal) {
if (first) return first = false;
set(key, newVal);
}));
};

// collect unwatch/listen functions and automatically
// run them when $scope is destroyed
var unwatchScope = $scope.$watch(key, scopeWatcher);
var unwatchConfig = $watch(key, configWatcher);
var unlisten = $scope.$on('$destroy', unwatch);

unwatchers.push(unwatch);
function unwatch() {
unwatchScope();
unwatchConfig();
unlisten();
_.pull(unwatchers, unwatch);
}

// return the unwatch function so users can unwatch manually
return unwatch;
}

function close() {
Expand Down

0 comments on commit 2cc7c13

Please sign in to comment.