对于新引用AngularFire 0.5.0,$ on on fires一次

时间:2013-12-25 01:14:02

标签: javascript angularjs firebase angularfire

让我们说使用 pushState 来导航路线:

$locationProvider.html5Mode(true);

有两条路由有两个不同的控制器:

$stateProvider.state('one', {
  url:'/one',
  templateUrl:'one.html',
  controller: 'oneCtrl'
});

$stateProvider.state('two', {
  url:'/two',
  templateUrl:'two.html',
  controller: 'twoCtrl'
});

oneCtrl创建与twoCtrl相同资源的新引用:

.controller('oneCtrl', ["$scope", "$firebase", function($scope, $firebase) {

  var oneRef = new Firebase("https://example.firebaseio.com/stuff");
  $scope.stuff = $firebase(oneRef);
  $scope.stuff.$on("loaded", function(value) {
    console.log(value);
  });
}])

.controller('twoCtrl', ["$scope", "$firebase", function($scope, $firebase) {

  var twoRef = new Firebase("https://example.firebaseio.com/stuff");
  $scope.stuff = $firebase(twoRef);
  $scope.stuff.$on("loaded", function(value) {
    console.log(value);
  });
}])
  • 如果我们导航到/one$on("loaded")事件会按预期触发 - oneRef唯一。
  • 如果我们从/one导航到/two,则$on("loaded")事件不会触发。

如果新的引用被实例化 - twoRef - 为什么回调没有第二次

1 个答案:

答案 0 :(得分:3)

这是因为本地缓存的数据会在Firebase中同步触发value个事件。

在第一次加载时,通过angularFire的_getInitialValue方法异步联系服务器。但是,在第二次加载时,由于该值已经是本地值,因此broadcast event会同步发生,因此在您的$ on('已加载的' ...)处理程序被附加之前。

有几个想法浮现在脑海中:如果控制器使用相同的$ firebase数据,那么在大多数常见用例中,应该只有一个。它应该移动到服务并相应地共享。

另一种解决方法是将加载的状态存储在服务或$ rootScope中。

最终,它应该是corrected in angularFire,以便加载的事件即使“'值”也会触发。已经同步加载。