AngularJS问题与ng-change和select标签

时间:2015-07-01 16:07:37

标签: javascript angularjs

我有一个奇怪的问题,即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/

感谢您的帮助

3 个答案:

答案 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。

你太近了! http://jsfiddle.net/geub5cxk/1/