当前位置: 首页 > 知识库问答 >
问题:

AngularJS Filter只按值属性而不是html元素的文本执行搜索?

姬康平
2023-03-14

我试图理解angularJS过滤器的机制,并尝试扩展其最初的功能。目前据我所知,当您执行过滤时,它将在每个html元素上搜索value属性来匹配。这在大多数情况下都很有效。这个问题的症结在于下拉列表。如果您将选项的文本设置为< code>Hello world并且value = 1,则搜索将查看< code >的value属性

<div ng-app="CategoryFieldApproversApp">

Search:<input id="txtSearch" ng-model="search" type="text" placeholder="Search" />

@using (Html.BeginForm("CategoryFieldApprovers", "Maintenance", FormMethod.Post))
{
    <div ng-controller="CategoryFieldApproversCtrl">
        <table class="table table-striped table-hover">
            <thead>
                <tr>
                    <th width="1%"></th>
                    <th ng-click="sort('Name')" width="200">Category Field</th>
                    <th ng-click="sort('Name')" width="150">Approver</th>
                    <th></th>
                </tr>
            </thead>
            <tbody>
                <tr dir-paginate="categoryFieldApprover in categoryFieldApprovers|orderBy:sortKey:reverse|itemsPerPage:5" ng-show="ddlVisibility(categoryFieldApprover)">
                    <td>
                        <input type="hidden" name="CategoryFieldApprovers[{{$index}}].CategoryFieldApproverID" ng-model="categoryFieldApprover.CategoryFieldApproverID" value="{{categoryFieldApprover.CategoryFieldApproverID}}" />
                        <input type="hidden" id="hdnIsDirty" name="CategoryFieldApprovers[{{$index}}].IsDirty" value="{{categoryFieldApprover.IsDirty}}" />
                    </td>
                    <td>
                        <input class="hdnCategoryFieldID" type="hidden" name="CategoryFieldApprovers[{{$index}}].CategoryFieldID" value="{{categoryFieldApprover.CategoryFieldID}}" />
                        <select ng-model="categoryFieldApprover.CategoryFieldID" ng-options="categoryField.CategoryFieldID as categoryField.Name for categoryField in categoryFields | filter:{Name :search}"></select>
                    </td>
                    <td>
                        <input class="hdnApproverOneUserID" type="hidden" name="CategoryFieldApprovers[{{$index}}].ApproverOneUserID" value="{{categoryFieldApprover.ApproverOneUserID}}" />
                        <select ng-model="categoryFieldApprover.ApproverOneUserID" ng-options="user.UserID as user.DisplayName for user in users | filter:{DisplayName :search}"></select>
                    </td>
                    <td>
                        <input type="button" ng-click="remove($index)" ng-show="categoryFieldApprover.ShowRemove" value="Remove" />
                    </td>
                </tr>
            </tbody>
        </table>
        <dir-pagination-controls max-size="5"
                                 direction-links="true"
                                 boundary-links="true">
        </dir-pagination-controls>
        <br />
        <a class="btn btn-default" ng-click="add()">Add Field Approver</a>
        <input class="btn-primary btn-sm" ng-click="save()" type="button" value="Save" />
    </div>
}
</div>

<script>
var App = angular.module('CategoryFieldApproversApp', ['angularUtils.directives.dirPagination']).controller('CategoryFieldApproversCtrl', function ($scope, $http) {

    $http.get("@Url.Action("GetCategoryFieldApprovers", "Maintenance")").success(function (response) {
        $scope.categoryFieldApprovers = response;  //ajax request to fetch data into $scope.data
    });

    $http.get("@Url.Action("GetCategoryFields", "Maintenance")").success(function (response) {
        $scope.categoryFields = response;  //ajax request to fetch data into $scope.data
    });

    $http.get("@Url.Action("GetUsers", "Maintenance")").success(function (response) {
        $scope.users = response;  //ajax request to fetch data into $scope.data
    });

    $scope.sort = function (keyname) {
        $scope.sortKey = keyname;   //set the sortKey to the param passed
        $scope.reverse = !$scope.reverse; //if true make it false and vice versa
    }

    $scope.remove = function (index) {
        $scope.categoryFieldApprovers.splice(index, 1);
    };

    $scope.add = function () {
        $scope.categoryFieldApprovers.splice(0, 0, {
            CategoryFieldApproverID: 0,
            CategoryFieldID: 0,
            ApproverOneUserID: 0,
            ApproverTwoUserID: 0,
            ShowRemove: true
        });
    };

    $scope.save = function () {
        $('tbody tr').find('.ng-dirty').each(function (i, dirtyElement) {
            $(dirtyElement).closest('tr').find('#hdnIsDirty').val(true);
        });

        $('form').submit();
    };

    $scope.ddlVisibility = function (categoryFieldApprover) {

        if ($('#txtSearch').val() != "" && (categoryFieldApprover.CategoryFieldID == null && categoryFieldApprover.ApproverOneUserID == null)) {
            return false;
        }
        else {
            return true;
        }
    }
});

</script>

更新:从tr元素中删除了|filter: search。然后为每个下拉列表添加了filter:{Name: search}。它现在将正确过滤和显示/隐藏那些通过检查的行。现在唯一剩下的问题是,当过滤器函数执行时,如果下拉列表所选项目未通过测试,它会将所选索引设置为0,即空白项目。我如何防止它仅仅因为未能从过滤器中包含而更改选择?

共有1个答案

宗政财
2023-03-14

请在这里看这个小演示。如果你正在寻找相同的功能,那么你只需要指定你想搜索的过滤器内的属性。

过滤器:{名称:搜索}

例如

<select ng-model="categoryFieldApprover.CategoryFieldID" ng-options="categoryField.CategoryFieldID as categoryField.Name for categoryField in categoryFields | filter:{Name :search}"></select>
 类似资料:
  • 问题 在解析获得一个Document实例对象,并查找到一些元素之后,你希望取得在这些元素中的数据。 方法 要取得一个属性的值,可以使用Node.attr(String key) 方法 对于一个元素中的文本,可以使用Element.text()方法 对于要取得元素或属性中的HTML内容,可以使用Element.html(), 或Node.outerHtml()方法 示例: String html =

  • 我有以下XML。 我在http://chris.photobooks.com/xml/default.htm上查看了它,它显示xpath无效,不确定问题出在哪里。

  • 问题内容: 所以我有一个这样的HTML字符串: 使用XPath,我可以使用以下Xpath查询来获取href属性的值: 而且,获得文本值甚至更容易,如下所示: 现在,我很想知道,我如何才能将这两个查询组合在一起而只用一个查询来获得两个值(如果这甚至是可能的话?)。 问题答案: 取 然后使用选中文本,使用选中属性。 除此之外,您可以将Xpath查询与Union Operator结合使用,从而可以使用

  • 我有以下元素。计数在跨度元素中,文本在 DIV 标记中。当我将鼠标悬停在计数上时,它只读取数字,当我将鼠标悬停在 DIV 标记的文本上时,它只读取文本。但我希望屏幕阅读器将完整文本读取为“1 文档”。为此,我保留了带有计数的“aria标签”属性,并为具有类“列表项”的父DIV保留了文本。但它仍然只阅读文本“文档”,而不是整个计数。

  • 问题内容: 我正在尝试查找具有Attribute的元素。好吧,我可以在Selenium中找到具有Id,tagName,Xpath和所有其他预定义方法的元素。但是,我正在尝试编写一种方法,该方法将给定属性名称和值作为输入专门返回WebElement。 假设XPath不是一个选择,还有其他更好的方法吗? 问题答案: 您可以使用CSS轻松完成此任务。 公式为: 所以如果有的话 您可以使用以下方法找到它:

  • 我正在尝试查找具有属性的元素。我可以在Selenium中找到Id、tagName、Xpath和所有其他预定义方法的元素。但是,我正在尝试编写一个方法,专门返回WebElement,给定属性名和值作为输入。 假设XPath不是一个选项,还有其他更好的方法吗?