【问题标题】:Angular ng-repeat with filter not updating with http.get带有过滤器的 Angular ng-repeat 不使用 http.get 更新
【发布时间】:2016-09-19 20:27:41
【问题描述】:

我正在使用查询过滤数组(results)。通过删除过滤器,results 可以准确显示所有元素。通过删除更新 results 的 http.get 并初始化 results 以包含元素,过滤器可以准确过滤。

随着过滤器和 http.get 更新 results,即使 results 包含数据,也会显示没有结果的消息。我已验证 results 已由 http.get 正确更新(如下所示 {{results}} 正确显示)。以下是 {{results}} 显示的内容:

[
  {
    "name": "Company Number 1 ",
    "description": "description of 1 "
  },
  {
    "name": "Company Number 1 ",
    "description": "description of 1 "
  },
  {
    "name": "Company Number 2 ",
    "description": "description of 2 "
  }
]

index.html

<div class="form-group label-floating">
    <label class="control-label" for="addon1">Filter</label>
    <input id="addon1" class="form-control" type="text" data-ng-model="query">
</div>

{{results}} <!--This works properly-->

<table class="table table-striped" id="resultsTable">
    <tbody>
    <tr data-ng-show="resultsFilter.length === 0">
        <td class="center" colspan="3">No results found.</td> <!--This message appears even when results should have elements-->
    </tr>
    <tr data-ng-repeat="result in resultsFilter = (results | filter:query | limitTo:displayNum) track by result.name">
        <td>
            <button class="btn btn-primary btn-block">
                {{result.name}}
            </button>
        </td>
    </tr>
    </tbody>
</table>

angular.js

$scope.query = "";
$scope.displayNum = 20;
$scope.results = [];
...
$scope.updateResults = function () {
    $http({
    method: "GET",
    url: requestUrl,
    params: {id: $scope.identifierInHierarchy.companyId}
})
    .then(function successCallback(response) {
        $scope.query = "";
        $scope.results = [];
        response.data.forEach(function (entry) {
            $scope.results.push({
                name: "Company Number " + entry.CompanyNumber,
                description: "description of " + entry.CompanyNumber
            });
        });
    },
        function errorCallback(response) {
        });
}

更新:不,将 resultsFilter 更改为 results 并不能解决问题。我也相信这不是错误的,因为保持 resultsFilter 和静态初始化结果将正确过滤(如前所述)。

【问题讨论】:

  • 你在哪里声明 resultsFilter?
  • 它没有被声明(或者以某种方式与它的赋值同时声明,我不确定)。但是,当结果未使用 GET 更新时,过滤会起作用。为了彻底起见,我在声明结果之后添加了声明 $scope.resultsFilter = [] ,但这实际上导致“无结果”消息与结果同时显示(当结果未使用 GET 更新时)。使用 GET,没有任何变化,只显示没有结果。
  • 我找到了用于创建 resultsFilter 的资源(和推理):angular-tips.com/blog/2014/08/…

标签: angularjs ng-repeat ng-filter


【解决方案1】:

因此没有显示任何结果

<tr data-ng-show="resultsFilter.length === 0">
        <td class="center" colspan="3">No results found.</td> <!--This message appears even when results should have elements-->
    </tr>

resultsFilter 范围仅限于 ng-repeat 并且您正尝试在范围之外访问它。所以请只用结果改变它,然后测试它。

希望这会有所帮助!

【讨论】:

  • 尝试了这个解决方案;没有成功。此外,在静态初始化结果而不使用 GET 时,这似乎不是问题。
【解决方案2】:

您在没有声明的任何地方都在使用resultsFilter。应该是results

<table class="table table-striped" id="resultsTable">
<tbody>
<tr data-ng-show="{{results.length}} === 0">
    <td class="center" colspan="3">No results found.</td> <!--This message appears even when results should have elements-->
</tr>
<tr data-ng-repeat="result in results = (results | filter:query | limitTo:displayNum) track by result.name">
    <td>
        <button class="btn btn-primary btn-block">
            {{result.name}}
        </button>
    </td>
</tr>
</tbody>

【讨论】:

  • 否,将 resultsFilter 更改为 results 并不能解决问题。我也相信这是不正确的,因为保持 resultsFilter 和静态初始化结果将正确过滤(如前所述)。
  • 您在data-ng-show="results.length ===0 周围缺少角度表达式符号{{}}。核实。 results.length 应该是 {{results.length}}
  • 按原样,过滤在不使用 GET 更新结果时起作用。通过添加 {{}},无论是否使用 GET,过滤都不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 2015-11-21
相关资源
最近更新 更多