AngularJS ng-repeat with filter - notarray 错误

AngularJS ng-repeat with filter - notarray error

我有一个要用 ng-repeat 显示的项目列表。我想为 show/hide 个归档项目添加过滤器。

我添加了一个复选框:

<input type="checkbox" ng-model="queryFilter.archived">Show archived messages

在我的控制器中我有这个:

$scope.queryFilter = {
    archived: false
};

我的项目列表显示在 table 中。我试过以下方法:

<tr ng-repeat="message in messages | filter : queryFilter">

<tr ng-repeat="message in messages | filter : { archived: queryFilter.archived }">

<tr ng-repeat="message in messages | filter : queryFilter track by $index">

我收到这个错误:

Error: [filter:notarray]

Expected array but received: {}

过滤确实有效,但我想知道为什么会出现错误。

您的 messages 必须包含 Object 格式的数据,而不是 Array 格式的数据。

这就是抛出此错误的原因。检查文档 https://docs.angularjs.org/error/filter/notarray

来自文档:

Filter must be used with an array so a subset of items can be returned. The array can be initialized asynchronously and therefore null or undefined won't throw this error.

因此请确保您的 $scope.messages 包含数组形式的数据而不是对象形式的数据。

$index 的跟踪使得 angular 语法不正确,因为它直接位于过滤器指令的后面。尝试将其移动到 后面 repeat 语句,以便在 track by 和 filter 语句之间有一个明确的分隔。

<tr ng-repeat="message in messages | filter : queryFilter track by $index">

我已将 messages 初始化为一个对象。

$scope.messages = {}; 更改为 $scope.messages = []; 使错误消失。

queryfilter 是对象而不是数组。因此,如下所示在查询过滤器上应用 ng-repeat <tr ng-repeat = "message in messages | filter : queryFilter track by $index">

如果 queryfilter 是数组,那么只需使用

<tr ng-repeat = "message in messages | filter : queryFilter">

每当我们循环对象时都需要通过 $index 进行跟踪