修剪后的 ng-model 如何过滤 Angularjs 结果
how filter Angularjs result by trimmed ng-model
我有三个输入框来过滤字段"tradeDate"
<input type="text" placeholder="Date YYYY" ng-model="search.DateYear">
<input type="text" placeholder="Date MM" ng-model="search.DateMonth">
<input type="text" placeholder="Date DD" ng-model="search.DateDay">
数据取自SQL服务器,日期是这样的
{"dayOfMonth":9,"dayOfWeek":"MONDAY","dayOfYear":130,
"month":"MAY","monthValue":5,"year":2016,"hour":12,"minute":38,"nano":0,"second":57,"chronology":{"id":"ISO","calendarType":"iso8601"}
所以当我想用 ng-repeat
过滤时,它会像:
<tr ng-repeat="trade in trades|filter:tradeDate.year:search.DateYear,
tradeDate.monthValue:search.DateMonth,tradeDate.dayOfMonth:search.DateDay">
<td>{{trade.blahhblahhField}}</td>
<td>{{trade.blahhblahhField}}</td>
<td>{{trade.tradeDate}}</td>
</tr>
但现在想改成一个输入框(ng-model:search.tradeDate
),格式为"YYYY-MM-DD"。我该如何过滤?
我试过这种方法:
ng-repeat="trade in trades|filter:tradeDate.year:trimYear(search.tradeDate),
tradeDate.monthValue:trimMonth(search.tradeDate),tradeDate.dayOfMonth:trimDay(search.tradeDate)"
像这样并在 js 中创建 3 个函数到 trim(例如:2016-05-20)
year: 子字符串得到 2016
$scope.trimYear = function(input){
var res = input.substring(0,4);
return res;
};
month:要得到 5 的子字符串(不是 05,因为数据中的月份值将为 5)
天:子串得到20
但这行不通;我假设它是因为第一次加载它时没有输入。我还是个新手,请问还有其他方法吗?
您可以使用自定义过滤器轻松完成此操作。这是一个如何创建过滤器的示例(我不得不猜测一些东西,所以您可能需要调整它以使其适合您的情况)。在过滤器函数中,input
是来自您的 ng-repeat
的交易列表,而 search
是您拥有 ng-model="search"
.[=21 的输入的 ng-model
值=]
.filter('customDateFilter', function() {
return function(input, search) {
var out = [];
angular.forEach(input, function(item) {
if(!search){
out.push(item);
} else {
var year = parseInt(search.substring(0,4));
var month = parseInt(search.substring(5,7));
var day = parseInt(search.substring(8,10));
if(item.tradeDate.year === year && item.tradeDate.monthValue === month && item.tradeDate.dayOfMonth === day){
out.push(item);
}
}
});
return out;
}
})
这是非常具体的,因此只有在输入完整日期时才会匹配,并且您需要验证用户输入的格式是 YYYY-MM-DD(或者更好的是,使用日期选择器控件)。现在您可以在 HTML:
中使用此过滤器
<tr ng-repeat="trade in trades | customDateFilter: search">
使用那一点 HTML 标记,您将 trades
对象(这是一个交易数组)传递给 customDateFilter
过滤器并传递 ng-model
search
到过滤函数。
我有三个输入框来过滤字段"tradeDate"
<input type="text" placeholder="Date YYYY" ng-model="search.DateYear">
<input type="text" placeholder="Date MM" ng-model="search.DateMonth">
<input type="text" placeholder="Date DD" ng-model="search.DateDay">
数据取自SQL服务器,日期是这样的
{"dayOfMonth":9,"dayOfWeek":"MONDAY","dayOfYear":130, "month":"MAY","monthValue":5,"year":2016,"hour":12,"minute":38,"nano":0,"second":57,"chronology":{"id":"ISO","calendarType":"iso8601"}
所以当我想用 ng-repeat
过滤时,它会像:
<tr ng-repeat="trade in trades|filter:tradeDate.year:search.DateYear,
tradeDate.monthValue:search.DateMonth,tradeDate.dayOfMonth:search.DateDay">
<td>{{trade.blahhblahhField}}</td>
<td>{{trade.blahhblahhField}}</td>
<td>{{trade.tradeDate}}</td>
</tr>
但现在想改成一个输入框(ng-model:search.tradeDate
),格式为"YYYY-MM-DD"。我该如何过滤?
我试过这种方法:
ng-repeat="trade in trades|filter:tradeDate.year:trimYear(search.tradeDate),
tradeDate.monthValue:trimMonth(search.tradeDate),tradeDate.dayOfMonth:trimDay(search.tradeDate)"
像这样并在 js 中创建 3 个函数到 trim(例如:2016-05-20)
year: 子字符串得到 2016
$scope.trimYear = function(input){
var res = input.substring(0,4);
return res;
};
month:要得到 5 的子字符串(不是 05,因为数据中的月份值将为 5)
天:子串得到20
但这行不通;我假设它是因为第一次加载它时没有输入。我还是个新手,请问还有其他方法吗?
您可以使用自定义过滤器轻松完成此操作。这是一个如何创建过滤器的示例(我不得不猜测一些东西,所以您可能需要调整它以使其适合您的情况)。在过滤器函数中,input
是来自您的 ng-repeat
的交易列表,而 search
是您拥有 ng-model="search"
.[=21 的输入的 ng-model
值=]
.filter('customDateFilter', function() {
return function(input, search) {
var out = [];
angular.forEach(input, function(item) {
if(!search){
out.push(item);
} else {
var year = parseInt(search.substring(0,4));
var month = parseInt(search.substring(5,7));
var day = parseInt(search.substring(8,10));
if(item.tradeDate.year === year && item.tradeDate.monthValue === month && item.tradeDate.dayOfMonth === day){
out.push(item);
}
}
});
return out;
}
})
这是非常具体的,因此只有在输入完整日期时才会匹配,并且您需要验证用户输入的格式是 YYYY-MM-DD(或者更好的是,使用日期选择器控件)。现在您可以在 HTML:
中使用此过滤器<tr ng-repeat="trade in trades | customDateFilter: search">
使用那一点 HTML 标记,您将 trades
对象(这是一个交易数组)传递给 customDateFilter
过滤器并传递 ng-model
search
到过滤函数。