我有一个案例,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,并在所有控制器完成初始化后发送广播.
是否有更优雅的方式在加载时通知控制器?
谢谢,
解决方法
在我看来,你有两个选择.由于您可能/可能未加载控制器的问题,我不建议在此实例中使用$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',$scope){ $rootScope.deviceReady.then(function( device ){ //do something with device }) });
2)如果您的平台允许注册多个就绪功能,只需将其添加到每个控制器,如果设备准备就应立即运行.
app.controller('GroupsCtrl',$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. }); });