作成中のアプリに Firebase と AngularFire を使用しようとしています。私は確かにAngularとFirebaseの初心者なので、助けていただければ幸いです。
Firebase には次のデータベース構造があります。
- エピック
- エピック 1
- ID
- タイトル等
- エピック2
- ID
- タイトル等
- エピック 1
ユーザー
ユーザー 1
-アクティブなエピソード
アクティブな叙事詩 1
アクティブな叙事詩 2
次のページでは、データベース内の各エピックの ng-repeat を示しています。各エピックにはボタンの列があり、そのうちの 1 つが問題を引き起こしています。現在のユーザーがすでにエピックを開始している場合 (たとえば、エピックがそのユーザーの「activeepics」に表示される場合)、ボタンには「Tap Out」と表示されます。エピックがユーザーのアクティブなエピックにない場合は、「開始」と表示されます。
ボタンは、ボタンのラベルに応じて、クリックされたときに異なることを行う必要があります。したがって、ボタンのラベルが「開始」と表示されている場合、アプリはエピックを現在のユーザーの「activeepics」に追加し、ボタンのラベルを「Tap Out」に変更する必要があります。対照的に、ボタン ラベルが「Tap Out」の場合、アプリは「activeepics」からエピックを削除し、ボタン ラベルを「Start」に戻す必要があります。
しかし、私はあらゆる種類の奇妙な振る舞いをしています。1 や 0 などのダミー ID を使用すると、アプリは正しいボタン ラベルを表示します。ただし、Firebase で生成された ID でエピックを追加すると、すべてのラベルが「開始」にリセットされます。また、アプリが各エピックを複数回ループしていることにも気付きました (表示される各エピックのデバッグ console.log を入力しました)。
問題は、Firebase データを $scope にバインドした後に複数の promise オブジェクトがあることだと思います。できれば助けてください!
コードは次のとおりです。
意見
<div ng-repeat="(name,epic) in epics | filter:search | orderBy:order | filter:{category:category}" class="epic">
<div>
<div class="small-block-grid-3 epicActions">
<li><a href="#"> Remix </a></li>
<li><a href="#/share"> Share </a></li>
<li><a href="#" ng-click="handleLabel(name)" prevent> {{getLabel(name)}} </a></li>
</div>
</ul>
</div>
</div>
コントローラ
$scope.desiredUser = UserService.getCurrentUser();
var ref = new Firebase("https://epicly.firebaseio.com/epics");
angularFire(ref, $scope, 'epics');
var ref2 = new Firebase("https://epicly.firebaseio.com/users");
angularFire(ref2, $scope, 'users').then(function(){
for (var i = 0; i<$scope.users.length; i++){
if($scope.users[i].email === $scope.desiredUser){
$scope.currUser = $scope.users[i];
}
}
var ref3 = new Firebase("https://epicly.firebaseio.com/users/" + $scope.currUser.id + "/activeepics");
angularFire(ref3, $scope, 'activeEpics').then(function(){
console.log($scope.activeEpics);
$scope.getLabel = function(epic){
console.log(epic);
for(var i = 0; i < $scope.activeEpics.length; i++){
if ($scope.activeEpics[i].id === epic) {
return "Tap Out";
}
}
return "Start";
}
$scope.handleLabel = function(name){
var label = $scope.getLabel(name);
if(label === "Tap Out"){
//remove from active epics
} else {
//add to activeepics
$scope.toAdd = {"id": name}
$scope.activeEpics.push($scope.toAdd);
}
}
});
});