From 710d33a409f1c44c81891108d70beefabd4b54df Mon Sep 17 00:00:00 2001 From: Michael Benford Date: Sun, 15 Dec 2013 19:21:42 -0200 Subject: [PATCH] fix(autocomplete): Prevent pending promises from executing Prevent pending promises from executing and showing the suggestion list after the user has already added a tag or cancelled autocomplete. Closes #36. --- build/ng-tags-input.js | 14 +++++++++-- build/ng-tags-input.min.zip | Bin 4036 -> 4055 bytes build/ng-tags-input.zip | Bin 6953 -> 7014 bytes src/auto-complete.js | 14 +++++++++-- test/auto-complete.spec.js | 48 +++++++++++++++++++++++++++++++++++- test/test-page.html | 14 +++++++++-- 6 files changed, 83 insertions(+), 7 deletions(-) diff --git a/build/ng-tags-input.js b/build/ng-tags-input.js index efb52c7a..b03e0da7 100644 --- a/build/ng-tags-input.js +++ b/build/ng-tags-input.js @@ -268,7 +268,7 @@ tagsInput.directive('tagsInput', ["$timeout","$document","tagsInputConfig", func */ tagsInput.directive('autoComplete', ["$document","$timeout","$sce","tagsInputConfig", function($document, $timeout, $sce, tagsInputConfig) { function SuggestionList(loadFn, options) { - var self = {}, debouncedLoadId, getDifference; + var self = {}, debouncedLoadId, getDifference, lastPromise; getDifference = function(array1, array2) { var result = []; @@ -283,6 +283,8 @@ tagsInput.directive('autoComplete', ["$document","$timeout","$sce","tagsInputCon }; self.reset = function() { + lastPromise = null; + self.items = []; self.visible = false; self.index = -1; @@ -307,7 +309,15 @@ tagsInput.directive('autoComplete', ["$document","$timeout","$sce","tagsInputCon $timeout.cancel(debouncedLoadId); debouncedLoadId = $timeout(function() { self.query = query; - loadFn({ $query: query }).then(function(items) { + + var promise = loadFn({ $query: query }); + lastPromise = promise; + + promise.then(function(items) { + if (promise !== lastPromise) { + return; + } + self.items = getDifference(items, tags); if (self.items.length > 0) { self.show(); diff --git a/build/ng-tags-input.min.zip b/build/ng-tags-input.min.zip index 70809573ae45033ecf89885f6911812860644a21..027ea93cf932043a8f2da996e80da723480dc55c 100644 GIT binary patch delta 2841 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 delta 2818 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 delta 5548 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 >Yt<{Zf1(Sh&Q&zr9jK!fwq#Z$|dMPp7O z&z|o0LDPAuL2yhCw?2+&yB_tyQVEqoP?R=*(s>ufG{dsKKzR|PFRfn{Fx^h3TB?V6 z?feXKLfevAN+W-ce4PfQf2MvsECDa)6((F$tKOcc3}g3bU#GVARCmLq*3f#okM}?VME;B2PJ@igwT{-FmuJ;~ zrWn)DN$Aw`8GfoDw2|P65-pZ2oPg?b6a0Ww&)fHpkJ0R;em3dk-DB@<{dbRH_Ugxx z@L>83-{Fw?_m%Knb2#%}X{QO+aZZ)v!^n4!Uj!(K&k)uFXK-YCgywA3W4NVBoBYLb zo)J=18L&$L7Upt?Mh65=^X3hqF|>w%YE%RQ?XSg)hX+jCZjTT7n>bcKSj2DN1El(9 z2tutfES{5%W&R{Pj?g+Lm%3S^oe~O9u#3e_?n;6#xMBP5=N 0) { self.show(); diff --git a/test/auto-complete.spec.js b/test/auto-complete.spec.js index 63fd03f4..71deeae4 100644 --- a/test/auto-complete.spec.js +++ b/test/auto-complete.spec.js @@ -265,6 +265,53 @@ describe('autocomplete-directive', function() { // Assert expect(suggestionList.selected).toBeNull(); }); + + it('discards all load calls but the last one', function() { + // Arrange + var deferred1 = $q.defer(), deferred2 = $q.defer(), deferred3 = $q.defer(); + var promises = [deferred1.promise, deferred2.promise, deferred3.promise]; + + $scope.loadItems = jasmine.createSpy().andCallFake(function() { + return promises.shift(); + }); + spyOn(suggestionList, 'show'); + + // Act + // First we need to register all promises + suggestionList.load('foobar', tagsInput.getTags()); + $timeout.flush(); + + suggestionList.load('foobar', tagsInput.getTags()); + $timeout.flush(); + + suggestionList.load('foobar', tagsInput.getTags()); + $timeout.flush(); + + // Now we resolve each promise which was previously created + deferred1.resolve(['Item1']); + deferred2.resolve(['Item2']); + deferred3.resolve(['Item3']); + + $scope.$digest(); + + // Assert + expect(suggestionList.show.calls.length).toBe(1); + }); + + it('discards all load calls after the suggestion list is reset', function() { + // Arrange + spyOn(suggestionList, 'show'); + suggestionList.load('foobar', tagsInput.getTags()); + $timeout.flush(); + + // Act + suggestionList.reset(); + + resolve(['Item3']); + + // Assert + expect(suggestionList.show).not.toHaveBeenCalled(); + }); }); describe('navigation through suggestions', function() { @@ -555,7 +602,6 @@ describe('autocomplete-directive', function() { // Assert expect($scope.loadItems).not.toHaveBeenCalled(); - }); }); diff --git a/test/test-page.html b/test/test-page.html index d14e79a5..e8e75d93 100644 --- a/test/test-page.html +++ b/test/test-page.html @@ -24,13 +24,23 @@