ng.module('smart-table') .directive('stSearch', ['stConfig', '$timeout','$parse', function (stConfig, $timeout, $parse) { return { require: '^stTable', link: function (scope, element, attr, ctrl) { var tableCtrl = ctrl; var promise = null; var throttle = attr.stDelay || stConfig.search.delay; var event = attr.stInputEvent || stConfig.search.inputEvent; attr.$observe('stSearch', function (newValue, oldValue) { var input = element[0].value; if (newValue !== oldValue && input) { ctrl.tableState().search = {}; tableCtrl.search(input, newValue); } }); //table state -> view scope.$watch(function () { return ctrl.tableState().search; }, function (newValue, oldValue) { var predicateExpression = attr.stSearch || '$'; if (newValue.predicateObject && $parse(predicateExpression)(newValue.predicateObject) !== element[0].value) { element[0].value = $parse(predicateExpression)(newValue.predicateObject) || ''; } }, true); // view -> table state element.bind(event, function (evt) { evt = evt.originalEvent || evt; if (promise !== null) { $timeout.cancel(promise); } promise = $timeout(function () { tableCtrl.search(evt.target.value, attr.stSearch || ''); promise = null; }, throttle); }); } }; }]);