使用 Firebase 数据过滤 ng 重复
Filter ng-repeat with Firebase Data
我有一组重复的事件,它们已经可以通过搜索框过滤。
<div class="well well-sm" ng-repeat="allEvent in allEvents | filter:searchText | orderBy:sortOrder" ng-if="allEvent.event.name">
<h3 id="cabynTitles">{{allEvent.event.name}}</h3>
<h3 id="cabynMemNum">{{allEvent.event.time}} </h3>
<button class="btn" ng-click="joinEvnt(allEvent.event.$id)">Join</button>
</div>
但是,我试图不显示用户已经要去的事件。 这些事件存储在 Firebase 中。
.filter('myEvents', function () {
return function (items) {
var filtered = [];
for (var i = 0; i < items.length; i++) {
var item = items[i];
var ref = new Firebase(furl + "/users/" + auth.uid + "/events/");
if (ref.child.equalTo(allEvent.event.$id) !== allEvent.event.$id) {
filtered.push(item);
} }
return filtered;
} }])
我认为它应该看起来像这样,但我无法将"allEvent.event.$id"传递给过滤器(这是事件的 firebase 键)。 任何帮助都会很棒,谢谢!
编辑
当前数据如下所示-
我的活动:
"events": {
"-KAw4iDuN2KdN-5pfQs0": true, //Instead of true, I can also make this the uid
"-KAw7Nn04WEoTDbatPn4": true
}
所有事件:我使用的是 geofire,所以我在 geoQuery 函数期间获取每个事件,并以此获取所有事件详细信息。
"-KAw4iDuN2KdN-5pfQs0": {
"name": "Event Name"
"description": "Blah blah"
...
}
我现在意识到在我重复之前必须过滤数据,并且由于我使用的是geoFire,因此我正在尝试在geoQuery期间使用类似以下内容对其进行过滤:
if (myEvents.indexOf(key) == -1) {
//push evenDetails to array to show in scope
};
其中key是事件的uid,myEvents是上面myEvents数据的firebaseArray。 但我猜indexof在firebaseArrays上不起作用?因为这不起作用。
你在这里遇到了两个问题:
- Firebase 只能根据是否存在值进行查询,而不能基于是否存在值进行查询
- Firebase 只能查询单个值,而不能查询多个值
因此,您的解决方案将是:
- 加载事件的完整列表
- 加载用户要访问的事件列表
- 循环访问 #1 并排除也在 #2 中的任何事件
- 将结果列表绑定到
$scope
更新 此代码段演示如何使用您描述的 JSON 结构完成步骤 3。
var myEvents = {
"-KAw4iDuN2KdN-5pfQs0": true,
"-KAw7Nn04WEoTDbatPn4": true
};
var allEvents = {
"-KAw4iDuN2KdN-5pfQs0": {
"name": "Event Name",
"description": "Blah blah"
},
"-KAw7Nn04WEoTDbatPn4": {
"name": "Event Name 2",
"description": "Blah blah"
},
"-KAw7Nn04WEoTDbatl9": {
"name": "Event Name 3",
"description": "Blah blah"
}
};
var filteredEvents = [];
Object.keys(allEvents).forEach(function(eventKey) {
if (Object.keys(myEvents).indexOf(eventKey) == -1) {
filteredEvents.push(allEvents[eventKey]);
}
});
document.getElementById('log').innerText = JSON.stringify(filteredEvents);
<pre id='log'></pre>
请注意,还有许多其他方法可以完成相同的任务。例如:Firebase 快照已经有一个循环遍历其子项的 forEach()
方法。并且您可以使用child.getKey()
获取当前子快照的密钥。
相关文章:
- 角度:在ng重复上切换图像
- 角度的项目列表 ng 重复,ng 单击显示全宽描述
- 防止ng重复中的重复值(AngularJS)
- 从键值结构中获取数据,并将其与AngularJS中ng重复的值进行比较
- 在ng重复循环中显示来自不同文件夹的图像
- 在ng重复循环中显示条件内容的最佳方式是什么
- 离子2:在离子载玻片内产生ng重复
- 正在ng重复元素上添加事件
- 嵌套ng重复angularjs
- ng模型内的ng重复的ng重复开始
- 混合元素的有角度的ng重复
- 如何避免在angular上多次调用方法;s ng重复
- 在表格格式中使用ng重复
- AngularJS ng重复处理空列表事例
- 如何在AngularJS-ng重复循环中将长JSON路径缩短为变量
- Angular在与ng重复作斗争
- ng重复中的ng模型-初始化唯一作用域属性
- ng重复变量到ng模型
- 尝试使用ng重复时出现空白屏幕
- 如何防止由ng重复引起的net::ERR_INSUFICIENT_RESOURCES错误