我有一个奇怪的问题,即ng-change不能正确使用ng-select。我附上了一个重现这个问题的小提琴。选择任何选项默认为"今年"选项。
<div ng-controller="MyCtrl">
<select ng-model="selectedRange" ng-change="dateFilter()">
<option value="week" selected>This week</option>
<option value="month">This month</option>
<option value="year">This year</option>
<option value="custom">Custom</option>
</select>
</div>
以上是我的看法。以下是选择标记触发的ng-change函数。
$scope.dateFilter = function () {
$scope.customDate = false;
var oneWeekAgo = new Date();
if ($scope.selectedRange == 'week') {
$scope.searchStartDate = new Date();
$scope.searchStartDate.setDate(oneWeekAgo.getDate() - 7);
}
if ($scope.selectedRange = 'month') {
$scope.searchStartDate = new Date();
$scope.searchStartDate.setMonth(oneWeekAgo.getMonth() - 1);
}
if ($scope.selectedRange = 'year') {
$scope.searchStartDate = new Date();
$scope.searchStartDate.setYear(oneWeekAgo.getYear() - 1);
}
if ($scope.selectedRange == 'custom') {
$scope.customDate = true;
}
}
http://jsfiddle.net/G8S32/1087/
感谢您的帮助
答案 0 :(得分:2)
在月份,年份条件中,您缺少“==”运算符
var myApp = angular.module('myApp',[]);
function MyCtrl($scope) {
$scope.dateFilter = function () {
//alert("Hello");
$scope.customDate = false;
var oneWeekAgo = new Date();
if ($scope.selectedRange == 'week') {
alert("week");
$scope.searchStartDate = new Date();
$scope.searchStartDate.setDate(oneWeekAgo.getDate() - 7);
}
if ($scope.selectedRange == 'month') {
alert("month");
$scope.searchStartDate = new Date();
$scope.searchStartDate.setMonth(oneWeekAgo.getMonth() - 1);
}
if ($scope.selectedRange == 'year') {
alert("year");
$scope.searchStartDate = new Date();
$scope.searchStartDate.setYear(oneWeekAgo.getYear() - 1);
}
if ($scope.selectedRange == 'custom') {
alert("custom");
$scope.customDate = true;
}
}
}
答案 1 :(得分:1)
您将=
与==
混淆。
在您的代码中,$scope.selectedRange
将始终设置为&#39; year&#39;,表达式$scope.selectedRange = 'year'
的结果将是真实值,因此以下代码始终执行:
$scope.searchStartDate = new Date();
$scope.searchStartDate.setYear(oneWeekAgo.getYear() - 1);
请将=
更改为==
以查看月份和年份,然后问题就解决了。
答案 2 :(得分:1)
你的Javascript应该是这样的:
var myApp = angular.module('myApp',[]);
function MyCtrl($scope) {
$scope.dateFilter = function (selectedRangeVal) {
$scope.customDate = false;
var oneWeekAgo = new Date();
// I would make this a switch or function called like this: dateFns[selectedRangeVal]();
if (selectedRangeVal == 'week') {
$scope.searchStartDate = new Date();
$scope.searchStartDate.setDate(oneWeekAgo.getDate() - 7);
}
if (selectedRangeVal = 'month') {
$scope.searchStartDate = new Date();
$scope.searchStartDate.setMonth(oneWeekAgo.getMonth() - 1);
}
if (selectedRangeVal = 'year') {
$scope.searchStartDate = new Date();
$scope.searchStartDate.setYear(oneWeekAgo.getYear() - 1);
}
if (selectedRangeVal == 'custom') {
$scope.customDate = true;
}
}
}
您的标记几乎完全相同,解决方案是添加{{selectedRange}}并将其传递给控制器dateFilter(选择)
<div ng-controller="MyCtrl">
<select class="atom-offerFilter--filterDate atom-widget--header__select" style="width: 150px; font-family: ' Museo', sans-serif;" ng-model="selectedRange" ng-change="dateFilter(selectedRange)">
<option value="week" selected>This week</option>
<option value="month">This month</option>
<option value="year">This year</option>
<option value="custom">Custom</option>
</select>
</div>
您不需要比较$ scope val,而是将ng-change上的更改值传递给控制器函数dateFilter(selectedValue)。
另外不要忘记==通常不是你想要的比较和=永远不是。几乎总是使用===,除非你想使用内置类型强制的javascripts。