让我们说使用 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
- 为什么回调没有第二次?
答案 0 :(得分:3)
这是因为本地缓存的数据会在Firebase中同步触发value
个事件。
在第一次加载时,通过angularFire的_getInitialValue方法异步联系服务器。但是,在第二次加载时,由于该值已经是本地值,因此broadcast event会同步发生,因此在您的$ on('已加载的' ...)处理程序被附加之前。
有几个想法浮现在脑海中:如果控制器使用相同的$ firebase数据,那么在大多数常见用例中,应该只有一个。它应该移动到服务并相应地共享。
另一种解决方法是将加载的状态存储在服务或$ rootScope中。
最终,它应该是corrected in angularFire,以便加载的事件即使“'值”也会触发。已经同步加载。