aboutsummaryrefslogtreecommitdiffstats
path: root/src/Scope.js
diff options
context:
space:
mode:
authorIgor Minar2011-09-01 14:19:22 -0700
committerIgor Minar2011-09-01 15:00:22 -0700
commit31b86241215bb37cc6bb81f98a47942738d710c2 (patch)
tree5cefa3afacad07b28b07654cde2280aa0e51a0eb /src/Scope.js
parenta5607e3061f5b0aa7988446025dba8f89413fd9d (diff)
downloadangular.js-31b86241215bb37cc6bb81f98a47942738d710c2.tar.bz2
feat(scope): add listener deregistration fn for $watch and $on
- both $watch and $on now return a function which when called deregisters the listener - $removeListener was removed and replaced with the above - added more tests for $watch and $on Closes #542
Diffstat (limited to 'src/Scope.js')
-rw-r--r--src/Scope.js51
1 files changed, 21 insertions, 30 deletions
diff --git a/src/Scope.js b/src/Scope.js
index e037cb06..6bb9a586 100644
--- a/src/Scope.js
+++ b/src/Scope.js
@@ -257,22 +257,29 @@ Scope.prototype = {
* - `string`: Evaluated as {@link guide/dev_guide.expressions expression}
* - `function(scope, newValue, oldValue)`: called with current `scope` an previous and
* current values as parameters.
+ * @returns {function()} Returns a deregistration function for this listener.
*/
$watch: function(watchExp, listener) {
- var scope = this;
- var get = compileToFn(watchExp, 'watch');
- var listenFn = compileToFn(listener || noop, 'listener');
- var array = scope.$$watchers;
+ var scope = this,
+ get = compileToFn(watchExp, 'watch'),
+ listenFn = compileToFn(listener || noop, 'listener'),
+ array = scope.$$watchers,
+ watcher = {
+ fn: listenFn,
+ last: Number.NaN, // NaN !== NaN. We used this to force $watch to fire on first run.
+ get: get
+ };
+
if (!array) {
array = scope.$$watchers = [];
}
// we use unshift since we use a while loop in $digest for speed.
// the while loop reads in reverse order.
- array.unshift({
- fn: listenFn,
- last: Number.NaN, // NaN !== NaN. We used this to force $watch to fire on first run.
- get: get
- });
+ array.unshift(watcher);
+
+ return function() {
+ angularArray.remove(array, watcher);
+ };
},
/**
@@ -538,6 +545,7 @@ Scope.prototype = {
*
* @param {string} name Event name to listen on.
* @param {function(event)} listener Function to call when the event is emitted.
+ * @returns {function()} Returns a deregistration function for this listener.
*
* The event listener function format is: `function(event)`. The `event` object passed into the
* listener has the following attributes
@@ -553,30 +561,13 @@ Scope.prototype = {
this.$$listeners[name] = namedListeners = [];
}
namedListeners.push(listener);
- },
-
- /**
- * @workInProgress
- * @ngdoc function
- * @name angular.scope.$removeListener
- * @function
- *
- * @description
- * Remove the on listener registered by {@link angular.scope.$on $on}.
- *
- * @param {string} name Event name to remove on.
- * @param {function} listener Function to remove.
- */
- $removeListener: function(name, listener) {
- var namedListeners = this.$$listeners[name],
- i;
- if (namedListeners) {
- i = indexOf(namedListeners, listener);
- namedListeners.splice(i, 1);
- }
+ return function() {
+ angularArray.remove(namedListeners, listener);
+ };
},
+
/**
* @workInProgress
* @ngdoc function