@@ -353,11 +353,13 @@ function $RootScopeProvider() {
353
353
* - `newVal` contains the current value of the `watchExpression`
354
354
* - `oldVal` contains the previous value of the `watchExpression`
355
355
* - `scope` refers to the current scope
356
- * @param {boolean= } objectEquality Compare for object equality using {@link angular.equals} instead of
357
- * comparing for reference equality.
356
+ * @param {boolean=|function() } objectEquality Compare for object equality using {@link angular.equals} instead of
357
+ * comparing for reference equality. If a function is passed, it will be used as a replacement for {@link angular.equals}.
358
+ * @param {function() } copier Replacement function for {@link angular.copy} to save value into oldVal for next
359
+ change event.
358
360
* @returns {function() } Returns a deregistration function for this listener.
359
361
*/
360
- $watch : function ( watchExp , listener , objectEquality ) {
362
+ $watch : function ( watchExp , listener , objectEquality , copier ) {
361
363
var get = $parse ( watchExp ) ;
362
364
363
365
if ( get . $$watchDelegate ) {
@@ -375,6 +377,14 @@ function $RootScopeProvider() {
375
377
376
378
lastDirtyWatch = null ;
377
379
380
+ if ( isFunction ( objectEquality ) ) {
381
+ watcher . comparator = objectEquality ;
382
+ }
383
+
384
+ if ( isFunction ( copier ) ) {
385
+ watcher . copier = copier ;
386
+ }
387
+
378
388
if ( ! isFunction ( listener ) ) {
379
389
watcher . fn = noop ;
380
390
}
@@ -763,12 +773,12 @@ function $RootScopeProvider() {
763
773
if ( watch ) {
764
774
if ( ( value = watch . get ( current ) ) !== ( last = watch . last ) &&
765
775
! ( watch . eq
766
- ? equals ( value , last )
776
+ ? ( watch . comparator ? watch . comparator ( value , last ) : equals ( value , last ) )
767
777
: ( typeof value === 'number' && typeof last === 'number'
768
778
&& isNaN ( value ) && isNaN ( last ) ) ) ) {
769
779
dirty = true ;
770
780
lastDirtyWatch = watch ;
771
- watch . last = watch . eq ? copy ( value , null ) : value ;
781
+ watch . last = watch . eq ? ( watch . copier ? watch . copier ( value , null ) : copy ( value , null ) ) : value ;
772
782
watch . fn ( value , ( ( last === initWatchVal ) ? value : last ) , current ) ;
773
783
if ( ttl < 5 ) {
774
784
logIdx = 4 - ttl ;
0 commit comments