我有一个案例,app.run
向所有控制器发送广播消息,但在其中一些实际加载之前。因此,他们没有抓住事件。
以下是一个例子:
app.run(function($rootScope){
// I get this event too fast and GroupsCtrl still not ready
ionic.Platform.ready(function(){
// notify controllers on device ready
$rootScope.$broadcast('notifyCtrlOnDeviceReady', device);
});
});
和控制器:
app.controller('GroupsCtrl', function($rootScope,$scope){
$scope.$on('notifyCtrlOnDeviceReady', function(event, device){
alert('notifyCtrlOnDeviceReady - done');
});
});
我想在服务中创建一些标志,但这似乎是一种解决方法。
我还想创建一个监听服务标志的$watch
,并在所有控制器完成初始化后发送广播。
是否有更优雅的方式在加载时通知控制器?
谢谢,
答案 0 :(得分:10)
我认为你有两种选择。由于您可能/可能未加载控制器的问题,我不建议在此实例中使用$ broadcast事件系统。
1) 您可以在rootscope上放置一个promise并在控制器中附加then语句:
app.run(function($rootScope, $q){
var dfd = $q.defer();
$rootScope.deviceReady = dfd.promise;
ionic.Platform.ready(function(){
dfd.resolve( device );
});
});
app.controller('GroupsCtrl', function($rootScope, $scope){
$rootScope.deviceReady.then(function( device ){
//do something with device
})
});
2)如果您的平台允许注册多个就绪功能,只需将其添加到每个控制器,如果设备准备就绪,应立即运行。
app.controller('GroupsCtrl', function($rootScope, $scope){
ionic.Platform.ready(function(){
//do something with device here.
});
});
如果可能的话,我个人会选择#2,因为它会让$ rootScope保持清洁,但无论哪种方式都可以。您甚至可以尝试将ionic.Platform准备好投入使用并注册,因此如果API发生变化,控制器将不会在以后修改。
app.factory("ionicPlatform"), function( $q ){
var ready = $q.defered();
ionic.Platform.ready(function( device ){
ready.resolve( device );
});
return {
ready: ready.promise
}
});
app.controller('GroupsCtrl', function($scope, ionicPlatform){
ionicPlatform.ready.then(function(device){
//do something with device here.
});
});
答案 1 :(得分:1)
我认为您的情况类似于此SO question(但不是重复),他们希望确保首先加载给定的控制器。
那里的答案建议避免"隐形"依赖项,我认为需要加载的所有控制器都是一个。
我建议使用具有标志和承诺功能的服务。控制器可以检查标志,如果它不成立,则调用该函数(可能WaitForLoaded()
并且可以准备好then
块来处理事物。然后标志的集合{{ 1}}承诺,仅从您的resolves
块设置。