Skip to content

Commit 3d58af7

Browse files
committed
Support to add search parameters and change search parameter's values via ng-model, fixed issue #7
* remove $watch on internal state variables and use ng-change instead * buffer changes and throttle changes to ng-model * detect changes to ng-model from the outside and add new search parameters or change their value
1 parent 8158e10 commit 3d58af7

File tree

3 files changed

+60
-16
lines changed

3 files changed

+60
-16
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
### 2.0.0 - unreleased
2+
* Support to add search parameters and change search parameter's values via ng-model, fixed issue #7
3+
14
### 1.1.1 - 03 February 2015
25
* update README with latest changes to dist files in bower package
36
* remove leading 'src/' path from template name

src/angular-advanced-searchbox.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
ng-keydown="keydown($event, $index)"
1919
ng-blur="leaveEditMode($index)"
2020
ng-show="searchParam.editMode"
21+
ng-change="searchParamValueChanged(searchParam)"
2122
ng-model="searchParam.value"
2223
placeholder="{{searchParam.placeholder}}" />
2324
</div>
@@ -32,6 +33,7 @@
3233
ng-blur="focus = false"
3334
typeahead-on-select="typeaheadOnSelect($item, $model, $label)"
3435
typeahead="parameter as parameter.name for parameter in parameters | filter:{name:$viewValue} | limitTo:8"
36+
ng-change="searchQueryChanged(searchQuery)"
3537
ng-model="searchQuery" />
3638
</div>
3739
<div class="search-parameter-suggestions" ng-show="parameters && focus">

src/angular-advanced-searchbox.js

Lines changed: 55 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,39 @@ angular.module('angular-advanced-searchbox', [])
2828
$scope.searchParams = [];
2929
$scope.searchQuery = '';
3030
$scope.setSearchFocus = false;
31+
var searchThrottleTimer;
32+
var changeBuffer = [];
3133

32-
$scope.$watch('searchQuery', function () {
33-
updateModel();
34-
});
34+
$scope.$watch('model', function (newValue, oldValue) {
35+
36+
if(angular.equals(newValue, oldValue))
37+
return;
3538

36-
$scope.$watch('searchParams', function () {
37-
updateModel();
39+
angular.forEach($scope.model, function (value, key) {
40+
if (key === 'query' && $scope.searchQuery !== value) {
41+
$scope.searchQuery = value;
42+
} else {
43+
var paramTemplate = $filter('filter')($scope.parameters, function (param) { return param.key === key; })[0];
44+
var searchParam = $filter('filter')($scope.searchParams, function (param) { return param.key === key; })[0];
45+
46+
if (paramTemplate !== undefined) {
47+
if(searchParam === undefined)
48+
$scope.addSearchParam(paramTemplate, value, false);
49+
else if (searchParam.value !== value )
50+
searchParam.value = value;
51+
}
52+
}
53+
});
3854
}, true);
3955

56+
$scope.searchParamValueChanged = function (param) {
57+
updateModel('change', param.key, param.value);
58+
};
59+
60+
$scope.searchQueryChanged = function (query) {
61+
updateModel('change', 'query', query);
62+
};
63+
4064
$scope.enterEditMode = function(index) {
4165
if (index === undefined)
4266
return;
@@ -60,6 +84,7 @@ angular.module('angular-advanced-searchbox', [])
6084
$scope.typeaheadOnSelect = function (item, model, label) {
6185
$scope.addSearchParam(item);
6286
$scope.searchQuery = '';
87+
updateModel('delete', 'query');
6388
};
6489

6590
$scope.addSearchParam = function (searchParam, value, enterEditModel) {
@@ -77,22 +102,29 @@ angular.module('angular-advanced-searchbox', [])
77102
);
78103

79104
//TODO: hide used suggestion
105+
106+
updateModel('add', searchParam.key, value);
80107
};
81108

82109
$scope.removeSearchParam = function (index) {
83110
if (index === undefined)
84111
return;
85112

113+
var searchParam = $scope.searchParams[index];
86114
$scope.searchParams.splice(index, 1);
87115

88116
//TODO: show hidden/removed suggestion
117+
118+
updateModel('delete', searchParam.key);
89119
};
90120

91121
$scope.removeAll = function() {
92122
$scope.searchParams.length = 0;
93123
$scope.searchQuery = '';
94124

95125
//TODO: show hidden/removed suggestion
126+
127+
$scope.model = {};
96128
};
97129

98130
$scope.editPrevious = function(currentIndex) {
@@ -172,21 +204,28 @@ angular.module('angular-advanced-searchbox', [])
172204
restoreModel();
173205
}
174206

175-
var searchThrottleTimer;
176-
function updateModel() {
207+
function updateModel(command, key, value) {
177208
if (searchThrottleTimer)
178209
$timeout.cancel(searchThrottleTimer);
179210

180-
searchThrottleTimer = $timeout(function () {
181-
$scope.model = {};
182-
183-
if ($scope.searchQuery.length > 0)
184-
$scope.model.query = $scope.searchQuery;
211+
// remove all previous entries to the same search key that was not handled yet
212+
changeBuffer = $filter('filter')(changeBuffer, function (change) { return change.key !== key; });
213+
// add new change to list
214+
changeBuffer.push({
215+
command: command,
216+
key: key,
217+
value: value
218+
});
185219

186-
angular.forEach($scope.searchParams, function (param) {
187-
if (param.value !== undefined && param.value.length > 0)
188-
$scope.model[param.key] = param.value;
220+
searchThrottleTimer = $timeout(function () {
221+
angular.forEach(changeBuffer, function (change) {
222+
if(change.command === 'delete')
223+
delete $scope.model[change.key];
224+
else
225+
$scope.model[change.key] = change.value;
189226
});
227+
228+
changeBuffer.length = 0;
190229
}, 500);
191230
}
192231

@@ -274,4 +313,4 @@ angular.module('angular-advanced-searchbox', [])
274313
};
275314
}
276315
]);
277-
})();
316+
})();

0 commit comments

Comments
 (0)