【问题标题】:ng-click value change + $scope.watch bind not working properlyng-click 值更改 + $scope.watch 绑定无法正常工作
【发布时间】:2015-09-07 04:55:43
【问题描述】:

我有一个范围变量“$scope.searchType”,默认情况下等于“createdAt”。在我的 HTML 中,我有更改范围变量值的选项:

<ul class="dropdown-menu" role="menu">
    <li><a ng-click="searchType = 'Anything'">Anything</a></li>
    <li><a ng-click="searchType = 'Payment'">Payment</a></li>
    <li><a ng-click="searchType = 'Total'">Total</a></li>
    <li><a ng-click="searchType = 'Tax'">Tax</a></li>
    <li><a ng-click="searchType = 'Payment Method'">Payment Method</a></li>
</ul>

在我的控制器中,我有以下内容可以监听变化:

$scope.$watch('searchType', function(newValue) {
    if(newValue == 'Payment') {
        $scope.searchTypeFilter = 'id';
        $scope.searchFiltered = true;
    } else if(newValue == 'Total') {
        $scope.searchTypeFilter = 'total';
        $scope.searchFiltered = true;
    } else if(newValue == 'Tax') {
        $scope.searchTypeFilter = 'tax';
        $scope.searchFiltered = true;
    } else if(newValue == 'Payment Method') {
        $scope.searchTypeFilter = 'paymentType';
        $scope.searchFiltered = true;
    } else {
        $scope.searchTypeFilter = '';
        $scope.searchFiltered = false;
        $scope.search = '';
    }
}, true);

由于某种原因,$scope.$watch 永远不会被调用。我无法弄清楚这是如何不起作用的,因为它曾经如此。这是“$scope.searchType”声明:

$scope.sortType = 'createdAt';

【问题讨论】:

  • 您的dropdown-menu html 是否包含在您放置$watch 的控制器中?
  • 你确定手表和下拉菜单在同一个范围内吗?
  • 是的,我相信它们是因为 $scope.$watch 在页面加载时进入一次。之后它再也不会运行了。

标签: javascript angularjs angularjs-scope angularjs-ng-click angularjs-watch


【解决方案1】:

您不需要添加 $watch,因为您有一个可以设置过滤器变量的点击事件。

你的 if/else 也可以用一个 js 对象来简化。

请看下面的演示或fiddle

angular.module('demoApp', [])
.controller('mainController', MainController);

function MainController($scope) {
    var filterMapping = {
        
        Payment: 'id',
        Total: 'total',
        Tax: 'tax',
        'Payment Method': 'paymentType',
        Default: ''
    };
    
    this.setNewFilter = function(name) {
        $scope.searchTypeFilter = filterMapping[name] || filterMapping['Default'];
        $scope.searchFiltered = $scope.searchTypeFilter != '' ? true: false;
    };
  
    this.setNewFilter(''); // init filter to anything
}

MainController.$inject = ['$scope'];
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="demoApp" ng-controller="mainController as ctrl">
<ul class="dropdown-menu" role="menu">
    <li><a ng-click="ctrl.setNewFilter('Anything')">Anything</a></li>
    <li><a ng-click="ctrl.setNewFilter('Payment')">Payment</a></li>
    <li><a ng-click="ctrl.setNewFilter('Total')">Total</a></li>
    <li><a ng-click="ctrl.setNewFilter('Tax')">Tax</a></li>
    <li><a ng-click="ctrl.setNewFilter('Payment Method')">Payment Method</a></li>
</ul>
    {{searchFiltered}}<br/>
{{searchTypeFilter}}    
</div>

【讨论】:

  • 你是救生员。太感谢了!! :)
  • 顺便说一句 - 为什么不看在这种情况下工作?
  • 手表也可以在这里使用。请参阅此jsfiddle。我不知道你的代码有什么问题。无论如何,我不会在这里添加手表,因为如果您的应用程序变大,它会减慢您的应用程序速度。因为它将在每个摘要循环中进行检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多