【问题标题】:I don't understand why Angulajs filter is not working as expected?我不明白为什么 Angulajs 过滤器没有按预期工作?
【发布时间】:2019-12-21 15:49:21
【问题描述】:

我有一个基于四个用户输入的 AngularJS 过滤器。两个输入,类别和作者,来自下拉列表。一种输入来自文本输入,另一种来自广播组。我使用一个按钮来清除用户输入。

当我在各自的输入中输入所需的值时,不显示过滤数据。当我单击按钮清除输入值时,会显示过滤后的数据。

由于我是 AngularJS 的新手,所以我不明白我在哪里做错了什么。

Filter.js

angular.module("customFilters", [])
.filter("unique", function() {
    return function(data, propertyName) {
        if (angular.isArray(data) && angular.isString(propertyName)) {
            var results = [];
            var keys = {};
            for (var i = 0; i < data.length; i++) {
                var val = data[i][propertyName];
                if (angular.isUndefined(keys[val])) {
                    keys[val] = true;
                    results.push(val);
                }
            }
            return results;
        } else {
            return data;
        }
    }
})

Controller.js

App
.controller('PadaListController', function($scope, $state, PagerService) {
    
    // Private Data
    var selectedCategory = null;
    var selectedAuthor = null;


    // Assigns user selected Category to private variable selectedCategory
    $scope.selectCategory = function(newCategory) {
        selectedCategory = newCategory;
    }
    
    // Filter padas by selected Category
    $scope.categoryFilterFn = function(pada) {
        return selectedCategory == null || 
            pada.category == selectedCategory;
    }

    // Assigns user selected Author to private variable selectedAuthor
    $scope.selectAuthor = function(newAuthor) {
        selectedAuthor = newAuthor;
    }

    // Filter padas by selected Author
    $scope.authorFilterFn = function(pada) {
        return selectedAuthor == null || 
            pada.author == selectedAuthor;
    }
});

list.html

<md-content>
<md-card md-theme="{{ appDefaults.showDarkTheme ? 'dark-blue' : 
appDefaults.theme || 'default' }}">
    <button type="button" ng- 
    click="catgry='';authr='';search='';direction=''">Clear 
    Filters</button>

    <md-card-header layout ng-click="showSearch=!showSearch">
        <md-card-avatar class="md-user-avatar">
            <md-icon md-svg-src="img/material/baseline-search-24px.svg"> 
            </md-icon>
        </md-card-avatar>
        <md-card-header-text>
            <div class="md-headline">Search</div>
            <div class="md-subhead">and Order</div>
        </md-card-header-text>
    </md-card-header>

    <!-- Card contents -->
    <div ng-show="showSearch">
        <md-card-content>
                 
            <label arial-label="category">Select Category</label>
            <md-select ng-model="catgry" ng- 
            change="selectCategory(catgry)">
                <md-option>None</md-option>
                <md-option value={{catgry}} 
                    ng-repeat="catgry in data.padas | orderBy:'category' | 
                    unique: 'category'">
                    {{catgry}}
                </md-option>
            </md-select>

            <label aria-label="author">Select Author</label>
            <md-select ng-model="authr" ng-change="selectAuthor(authr)">
                <md-option value={{authr}} 
                ng-repeat="authr in data.padas | orderBy:'author' | 
                unique: 'author'">
                    {{authr}}
                </md-option>
            </md-select>
            
            <md-input-container>
                <label aria-label="pada search">Search/Goto</label>
                <input type="text" ng-model="search" />   
            </md-input-container>

            <md-radio-group ng-model="direction">
                <md-radio-button value="" aria-label="आरोही क्रम"> 
                    Ascending</md-radio-button>    
                <md-radio-button value="reverse" aria-label="अवरोही 
                    क्रम">Descending</md-radio-button>
            </md-radio-group>
    
        </md-card-content>
    </div>
</md-card>

<md-card
    ng-repeat="pada in (filteredPadas = (data.padas | 
    filter:categoryFilterFn | filter:authorFilterFn | filter:search | 
    orderBy:direction))" ng-click="showPadaDetails=!showPadaDetails">
        <!-- Filtered Contents -->
</md-card>
</md-content>

当我在各个输入字段中输入值时,我想显示过滤后的数据,当我单击清除过滤器按钮时,应该显示整个数据。

【问题讨论】:

  • 您的数据是什么样的?我的意思是给我一个 $scope.data 值的例子

标签: angularjs filter


【解决方案1】:

我认为问题在于您在 ng- 部分之后的 "ng-click" 中有空格,例如 "ng-click"ng-change也有同样的问题 删除空格并将其连接为一个单词,如果对您有帮助,请告诉我。

我注意到的另一件事

ng-repeat="catgry in data.padas | orderBy:'category' | unique: 'category'"里面

您应该显示 data.padas 对象的内容,而不是

{{catgry}}

应该是

{{catgry.category}}

ng-repeat="authr in data.padas | orderBy:'author' | unique: 'author'" 也一样

而不是

{{authr}}

应该是

{{authr.author}}

【讨论】:

  • 感谢您花时间调查问题并回复。很抱歉,您指出的原因(空格)无效。我检查了我的代码。当我重新格式化此站点上的代码以发布我的问题时,可能已插入空间。我请求你再看看这个问题......
  • $scope.data.padas 是一个对象数组,如下所示:
  • $scope.data.padas 是一个对象数组,如下所示: data.padas = [ { "padaID": 1, "pageNo": "11", "gorelalPg": " 1“,”padasankhya“:”。पद。1。“,”标题“:”प्रथमलड़ाऊँलड़ाऊँश्री“,”名称“:”मंगलाचरन“,”类别“:”类别“:”मंगलाचरन“,”作者“:”श्रीस्वामीकृष्णदासजू “,”Raag“:”सूहौबिलावल“,”塔瓦“:”रूपक(सातमात्रा)“,”歌词“:[”प्रथमलड़ाऊँश्रीगुरु,बंदनकरिश्रीहरिदास“,”विपुलप्रेमनिजुनेमगहि,कहिसुजसबिहारिनदास ॥१॥” ] }, ...]。这个数组有 787 个对象。这个是最短的歌词属性。
  • 你有没有注意 unique 过滤器,它返回传递给它的唯一属性数组。在这种情况下,我传递 categoryauthor 属性并获取数组作为回报。
  • 这就是为什么 catgry.categoryauthr.author 不可能像 catgryauthr 不是对象,而是字符串。如果我做错了,请纠正我。所有代码都工作正常,但过滤器没有被清除,仅此而已。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 2020-02-29
相关资源
最近更新 更多