2016-04-16 4 views
1

$ firebaseArray(boxes)からアイテムを削除しようとしています。 Firebase配列アイテムが削除され、直ちに自動追加されます(AngularFireを使用)

削除funcion:それは作品

function remove(boxJson) { 
     return boxes.$remove(boxJson); 
    } 

は、しかし、すぐに戻って追加されます。

function getBoxes(screenIndex) { 

     var boxesRef = screens 
      .child("s-" + screenIndex) 
      .child("boxes"); 

     return $firebaseArray(boxesRef); 

    } 

:これは配列をもたらす方法である

enter image description here

firebaseArrayへの複数の参照を保持していると思います一方が削除されるともう一方が追加されますが、firebaseはそれを処理する必要があると思いますか?

とにかく私はこれに迷っています。

UPDATE

私はそれをハックして(タイムアウト付き)二回削除するには、それが動作しているようです:

function removeForce(screenIndex, boxId) { 

     setTimeout(function() { 
      API.removeBox(screenIndex, boxId); 
     }, 1000); 

     return API.removeBox(screenIndex, boxId); 
    } 

とAPI.removeBox:

function removeBox(screenIndex, boxId) { 

     var boxRef = screens 
      .child("s-" + screenIndex) 
      .child("boxes") 
      .child(boxId); 

     return boxRef.remove(); 
    } 
+0

どのように配列を作成しますか?何かがあなたの配列を同期させて保持しているかもしれません。すなわち、常にその要素があることを確認してください。 – akhaku

+0

配列はサーバーから来ます。私は$ firebaseArrayを使用しました。私は問題を発見しました - 私の一部のバグは、それらを削除した後にアイテムを保存していました。おっとっと。あなたのコメントAkhakuありがとうございます。 – Guy

答えて

1

ときそれは非同期ですfirebaseから何かを削除します。項目を削除するための適切な方法がfirebaseからであるドキュメントごと、AngularFireを使用すると、次のとおりです。

var obj = $firebaseObject(ref); 
obj.$remove().then(function(ref) { 
    // data has been deleted locally and in the database 
}, function(error) { 
    console.log("Error:", error); 
}); 

$(削除)...ローカルおよびデータベースからオブジェクト全体を削除します。このメソッドは、データがサーバーから削除されたときに実行される約束を返します。この約束は、駆除されたレコードのFirebaseのリファレンスで解決されます。ドキュメントへ

リンク:https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebaseobject-remove

+0

ありがとうございます。私はコールバックを追加しました。それはそれがうまく削除されたと言いますが、それは再び再現されます。調査の結果、 – Guy

1

最も可能性の高い原因は、あなたが削除を禁止セキュリティルールを持っているということです。

boxes.$removeに電話すると、即座にchild_removedイベントが発生し、UIがすぐに更新されるようになります。その後、Firebaseサーバにコマンドを送信してチェックし、データベースを更新します。

サーバーには、この削除を許可しないセキュリティルールがあります。サーバーはクライアントに「失敗しました」という応答を返し、クライアントはUIを修正するためにchild_addedイベントを発生させます。

+0

私は2回削除すると(タイムアウト付きで)削除するので、これを許可する必要があることに気付きました。質問への更新としてコードを追加しました。 – Guy

+1

ほとんどの場合、アイテムを追加してgitを削除して競合状態に陥っている可能性があります。しかし、そのようなコードを質問に追加しなければならないのは、まず問題を最小限に再現しなければならないという兆候です。 [MCVE](http://stackoverflow.com/help/mcve)を参照してください。そうすれば、完全なアプリからの不完全なレプロから作業するよりも効率的にお手伝いできます。 –

+0

あなたは正しいです。それは簡単だろう、私はしようとMCVEを作成します。時間がかかりますが、かなり大きなプロジェクトです。ボックス配列は、そのデータ構造のバックボーンです。 – Guy

1

私はアイテムを削除した後にもう一度保存していました。明らかに私の間違い:

function removeSelected(boxes) { 
     var selectedBoxes = Selector.getSelectedBoxes(boxes); 

     angular.forEach(selectedBoxes, function (box) { 

      BoxManager.remove(box); 

     }); 

     Selector.clearSelection(boxes, true); 
    } 

clearSelectionメソッドでは、ボックスのフィールドを更新してもう一度保存しました。

明白な間違いに加えて、これはFirebaseの使い方に関する私の教訓です。システムの一部が削除したアイテムのコピーを保持している場合、それを保存してもバグは発生しませんが、削除されたアイテムは復活します。

関連する問題