我想在表单上实现开始日期和结束日期,但也允许用户从下拉列表中的一堆预设日期范围中进行选择。如果用户从下拉列表中选择一个值,则会填充开始日期和结束日期字段。如果用户编辑其中一个字段,则下拉列表会将其自身设置为“自定义”选项。
我的“幼稚”实现如下,但很明显,无论用户或控制器是否更改了字段,所有手表都会触发。如何设置我的手表以便这可能起作用?
HTML
<div ng-controller="ExportCtrl">
<select ng-model="dateRange" ng-options="d.name for d in dateRanges"></select>
<input type="text" ng-model="startDate" />
<input type="text" ng-model="endDate" />
</div>
JS
module.controller("ExportCtrl", function ($scope) {
$scope.dateRanges = [
{ name: 'Custom', startDate: null, endDate: null },
{ name: 'Today', startDate: moment().startOf('day'), endDate: moment().endOf('day') },
{ name: 'Yesterday', startDate: moment().subtract('day', 1).startOf('day'), endDate: moment().subtract('day', 1).endOf('day') },
{ name: 'Last 3 days', startDate: moment().subtract('day', 2).startOf('day'), endDate: moment().endOf('day') },
{ name: 'Last 7 days', startDate: moment().subtract('day', 6).startOf('day'), endDate: moment().endOf('day') },
{ name: 'Last 30 days', startDate: moment().subtract('day', 29).startOf('day'), endDate: moment().endOf('day') },
{ name: 'Month to Date', startDate: moment().startOf('month'), endDate: moment().endOf('day') },
{ name: 'Last month', startDate: moment().subtract('month', 1).startOf('month'), endDate: moment().subtract('month', 1).endOf('month') },
{ name: 'Last 3 months', startDate: moment().subtract('month', 3).startOf('day'), endDate: moment().endOf('day') }
];
$scope.dateRange = $scope.dateRanges[1];
$scope.$watch('dateRange', function (newValue, oldValue) {
if (oldValue === newValue) {
return;
}
$scope.dateRange = newValue;
$scope.startDate = $scope.dateRange.startDate;
$scope.endDate = $scope.dateRange.endDate;
});
$scope.$watch('startDate', function (newValue, oldValue) {
if (oldValue === newValue)
return;
$scope.dateRange = $scope.dateRanges[0];
$scope.startDate = newValue;
});
$scope.$watch('endDate', function (newValue, oldValue) {
if (oldValue === newValue)
return;
$scope.dateRange = $scope.dateRanges[0];
$scope.endDate = newValue;
});
});
答案 0 :(得分:1)
您的观察者会导致循环依赖。你应该同时观看它们并在那里定义你的逻辑。
$scope.$watch(function() { return $scope.dateRange + ',' + $scope.startDate.getTime() + ',' + $scope.endDate.getTime(); }, function (newValue, oldValue) {
//recover new values of all three variables from newValue.split(',')
//if all three values satisfy the constraints defined in $scope.dateRanges, return
//if dateRange changes, change startDate and endDate
//if startDate or endDate changes, change dateRange
});