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;
var trimSearch = attr.trimSearch || stConfig.search.trimSearch;
//兼容Edge
if (element[0].localName == 'select') {
event = 'change';
}
attr.$observe('stSearch', function(newValue, oldValue) {
var input = element[0].value;
if (newValue !== oldValue && input) {
ctrl.tableState().search = {};
input = ng.isString(input) && trimSearch ? input.trim() : input;
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() {
var input = evt.target.value;
input = ng.isString(input) && trimSearch ? input.trim() : input;
tableCtrl.search(input, attr.stSearch || '');
promise = null;
}, throttle);
});
}
};
}
]);