【发布时间】:2017-03-02 04:25:19
【问题描述】:
所以我有一个新闻文章列表,我需要过滤它们,但服务器端而不是客户端。
我过滤的方式是有一个下拉列表,用户可以点击它来过滤文章,如下所示:
<ul>
<li ng-repeat="category in categories">
<span href="" ng-click="getFilteredArticles(category.id)">{{category.title}}</span>
</li>
</ul>
并且文章是通过像这样的 ng-repeat 填充的
<ul infinite-scroll="addPosts()" infinite-scroll-distance="0" infinite-scroll-disabled="stopScrolling" class="c-news">
<li ng-repeat="post in posts" class="c-news__item" ng-click="selectPost(post)">
<!-- Omitted some code for the sake of brevity -->
</li>
</ul>
getFilteredArticles 方法如下所示
$scope.getFilteredArticles = function (categoryId) {
var posts = $scope.posts;
posts.forEach( (object) => {
if ( object[Categories.Id] === categoryId ) {
$scope.filteredArticles.push(object);
}
});
console.log($scope.filteredArticles);
}
我正在提取的典型 JSON 对象如下所示
{
"Title":"Test Title",
"Summary":"",
"PublishedDate":"2016-10-17T09:42:00",
"Author":{
"Id":"480586a5-2169-e611-9426-00155d502902",
"FirstName":"TestFirst",
"LastName":"TestSecond",
"Email":"test@test.com"
},
"Id":99,
"StatusName":"Published",
"Status":2,
"Categories":[
{
"Id":1,
"Name":"Category 1",
"ArticleCount":31,
"UnpublishedArticleCount":1
},
{
"Id":2,
"Name":"Category 2",
"ArticleCount":19,
"UnpublishedArticleCount":0
}
],
"AttachmentCount":0,
"FilesAwaitingCheckIn":0
}
我希望当用户单击其中一个过滤器选项时,列表会过滤到单击的选项。我已经做到了这一点,但后来我得到了一个 ReferenceError: Categories is not defined。
我的 getFilteredArticles() 代码来自另一个 Stack 问题,可以在 here 找到。
我知道能够只过滤 ng-repeat,但是我的经理不想走这条路,而是由于我们可能拥有的帖子数量而宁愿过滤服务器端。
有什么想法吗?
编辑 这是里面的内容$scope.posts array
【问题讨论】:
-
如果
Categories是posts的一个属性,你应该像这样定义object["Categories"]["Id"] === categoryId -
感谢 Nishant,它让我克服了这个错误。现在 console.log 只是吐出一个空数组。可能是因为每个类别 id 都在 Categories 对象中的一个单独对象中吗?
-
我猜
if条件没有得到满足。您使用了严格的检查===。检查两种类型是否相同。"2"和2之间存在差异。还要在if条件之前调试循环内的值 -
感谢您的及时回复,所以我 console.log(object["Categories"]["id"]);这会吐出(20)条未定义的消息。但是,当我删除 ["id"] 时,我会得到每个对象类别对象吐出。我猜在分类对象中遍历到 id 有什么问题吗?抱歉,如果我遗漏了一些基本的东西,我更像是一个 UI 设计师而不是开发人员/程序员 :)
-
抱歉回复晚了。你能用
posts数组更新你的问题吗?
标签: javascript angularjs arrays json filtering