1

アプリケーションに 1 人のユーザーがいるシナリオで AngularFire を使用することに成功していました。

認証を実行できるようになったので、主に正しく更新できないために、ユーザーを切り替えるときにitemsへの割り当てが壊滅的であることに気付きました。$scope.items$scope

ドキュメントから直接読む...

var ref = new Firebase('https://<my-firebase>.firebaseio.com/items');
angularFire(ref, $scope, 'items');

itemsこれらは、現在許可されているユーザーのみのものである必要があります。現在、私はこれを行っています(より良い方法があれば、遠慮なく教えてください!)

var ref = new Firebase('https://<my-firebase>.firebaseio.com/items/userId');
angularFire(ref, $scope, 'items');

userIdと を使用しauth.providerて生成しauth.idます。私のアイテムがネームスペース化されたので(言ってみましょう)user1

var ref = new Firebase('https://<my-firebase>.firebaseio.com/items/[user1id]');
angularFire(ref, $scope, 'items');

にアイテムを追加します$scope.items

$scope.create = function(item) {

  $scope.items.push(item)
  /* Pretend the user adds these from the interface.
  [
    { name: 'eenie' },
    { name: 'meenie' },
    { name: 'miney' },
    { name: 'moe' }
  ]
  */

}

問題

ログアウトして別のユーザーとしてログインすると、魔法のようにそのユーザーがログアウトeenie meenie mineyとログインの間に配列を保持しているmoeためです。$scope.items

ログアウト イベントを設定しようとしまし$scope.items = []たが、実際にはすべてのレコードが空になります。髪を引っ張っています。これは、プロジェクトで必要な作業の 0.001% であり、週末全体を費やしています。

更新新しいメソッド

  $scope.create = function() {
    $scope.selectedDevice = {
      name: 'New Device',
      userId: $scope.user.provider + $scope.user.id
    };
    return $scope.devices.push($scope.selectedDevice);
  };

  $scope.$on('angularFireAuth:login', function(evt, user) {
    var promise, ref;
    ref = new Firebase('https://mysite.firebaseio.com/users/' + (user.provider + user.id) + '/registry/');
    promise = angularFire(ref, $scope, 'devices');
  });

ユーザーの ID でアイテムを正確に作成するようになりました。ただし、ログアウトして再度ログインすると、これらの項目は からクリアされません$scope.devices。したがって、それらは自分自身をデータに追加するだけですが、新しくログインしたユーザーの下にあります。

アップデート

私は多くの試行錯誤をしました。私はおそらく、考えられるあらゆる組み合わせでログインイベントを設定$scope.devices[]て移動しました。最終的に機能したのは、受け入れられた回答の@hiattpのフィドルでした。

4

2 に答える 2

2

これは、ユーザーを切り替えても、暗黙的なデータ バインディングがそのまま残っているためです。新しいユーザーが現れて新しいバインドを作成すると、既存のデータは同化する必要があるローカルの変更であると見なされます (そのため、元のユーザーのアイテムが新しいユーザーに追加されていることがわかります)。ただし、それらをクリアしようとすると最初にバインディングを解放せずに、元のユーザーの項目リストからそのデータを削除するように Firebase に暗黙的に指示します (これも、必要なものではありません)。そのため、必要に応じてログアウト (またはログイン) イベントを検出したら、データ バインディングを解放する必要があります。

promiseのコールバックangularFireは、「unbind」メソッドを提供します (こちらこちらを参照)。

var promise = angularFire(ref, $scope, 'items');
promise.then(function(unbind){
  // Calling unbind() will disassociate $scope.items from Firebase
  // and generally it's useful to add unbind to the $scope for future use.
});

コードにいくつかの特異性があり、それが原因で動作しない可能性が高くunbind、ローカル コレクションがクリアされないことを覚えておいてください。しかし、それがどのように機能するか(そして機能することを証明するため) を理解するために、ここに fiddleを示します。

于 2013-10-20T23:29:10.753 に答える
1

ログアウト時に $scope.items のバインドを解除する必要があります。これを行う最善の方法は、promise に指定された unbind 関数を $scope に保存することです。

var ref = new Firebase('https://<my-firebase>.firebaseio.com/items/[user1id]');
angularFire(ref, $scope, 'items').then(function(unbind) {
  $scope.unbindItems = unbind;
});

$scope.$on('angularFireAuth:logout', function() {
  $scope.unbindItems();
});
于 2013-10-21T21:56:28.317 に答える