【发布时间】:2016-06-09 12:25:19
【问题描述】:
我是 Angular 新手,在我的应用程序的 ng-repeat 问题上需要您的帮助。
问题:
我有一个 html 页面 (event.html),在文件的相应控制器中,我向 firebase 集合发出请求并更新数组 ($scope.events)。问题是来自 firebase 的数据需要几秒钟才能加载,并且当数据到达 $scope.events 时,ng-repeat 已经执行并且它显示一个空白屏幕。当我点击 HTML 页面 (event.html) 中的按钮时,这些项目会正确显示。
事件顺序:
我有一个登录页面 (login.html),我在其中输入用户名和电话号码,然后单击注册按钮。我已经配置了单击注册按钮以进入新状态(event.html)。
这是login.html的控制器代码:
$scope.register = function (user) {
$scope.user = user.name;
$scope.phonenumber = user.phonenumber;
var myuser = users.child($scope.user);
myuser.set({
phone : $scope.phonenumber,
Eventid : " ",
name : $scope.user
})
var userid = myuser.key();
console.log('id is ' +userid);
$state.go('event');
}
event.html(状态:event)的控制器代码如下:
var ref = new Firebase("https://glowing-torch-9862.firebaseio.com/Users/Anson/Eventid/");
var eventref = new Firebase("https://glowing-torch-9862.firebaseio.com/Events");
var myevent = " ";
$scope.events = [];
$scope.displayEvent = function (Eventid) {
UserData.eventDescription(Eventid)
//UserData.getDesc()
$state.go('myevents');
//console.log(Eventid);
};
function listEvent(myevents) {
$scope.events.push(myevents);
console.log("pushed to array");
console.log($scope.events);
};
function updateEvents(myevents) {
EventService.getEvent(myevents);
//console.log("success");
};
ref.once('value', function (snapshot) {
snapshot.forEach(function (childSnapshot) {
$scope.id = childSnapshot.val();
angular.forEach($scope.id, function(key) {
eventref.orderByChild("Eventid").equalTo(key).on("child_added", function(snapshot) {
myevents = snapshot.val();
console.log(myevents) // testing 26 Feb
listEvent(myevents);
updateEvents(myevents);
});
});
});
});
$scope.createEvent = function () {
$state.go('list');
}
event.html 包含以下代码:
<ion-view view-title="Events">
<ion-nav-buttons side="primary">
<button class="button" ng-click="createEvent()">Create Event</button>
<button class="button" ng-click="showEvent()">Show Event</button>
</ion-nav-buttons>
<ion-content class="has-header padding">
<div class="list">
<ion-item align="center" >
<button class= "button button-block button-light" ng-repeat="event in events" ng-click="displayEvent(event.Eventid)"/>
{{event.Description}}
</ion-item>
</div>
</ion-content>
</ion-view>
按钮showEvent 是我添加到HTML 文件中以测试ng-repeat 的虚拟按钮。我可以在控制台中看到从 firebase 下载数据大约需要 2 秒,如果我在加载数据后单击“显示事件”按钮,ng-repeat 会按预期工作。在我看来,当ng-repeat 对数组$scope.events 进行操作时,不会从firebase 中检索到数据,因此它是空的,因此它没有任何数据可以呈现到HTML 文件中。 ng-repeat 在我单击虚拟按钮(“显示事件”)时按预期工作,因为在单击时会触发摘要循环。对于这篇冗长的帖子,我深表歉意,如果你们中的任何人能给我一个克服这个问题的方向,我将不胜感激。我一直在互联网和 stackoverflow 中搜索,发现了许多博客和线程,这让我知道问题出在哪里,但我无法让我的代码正常工作。
【问题讨论】:
-
我不熟悉 Angular,但在 React 中,我为 Firebase 所做的是通过
ref.on('value', functionToExecuteWhenLoaded())之类的方式监听数据我不确定这在 Angular 中是否可行,但我认为解决方案这将是使用ref.on()方法来监听数据,然后让ng-repeat触发。再说一次,完全是 Angular 菜鸟,但也许有人有一个代码示例给你。 -
感谢 Elliott,Angular 支持 ref.on 方法。我已将代码更改为 ref.on 而不是 ref.once
标签: javascript html angularjs dom