好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

angular系列彻底的异步解决

 Angular 的异步处理的真的很不错。基于消息广播的方式,并且可以向上传递,基本上解决了不同模块,不同controller之间不方便异步的问题。

 

        场景一:通过回调函数进行异步操作(该情况下不用消息广播的机制)

        这种情况的特点是直接传递一个回调函数给异步操作就可以了,等异步操作完执行回调。

        比如:controller通过server异步取数据,等取完数据进行一系列的操作,这个时候就可以把操作封装到函数中,传递给异步操作函数。

        controller代码片段举例如下:

[javascript]   view plain   copy

 

$scope.submit= function(){       userService.login($scope.user.loginname.value,$scope.user.password.value, function(data){            if(data.success){               location.href =  'views/main/index.html';           } else{               $scope.user.error.tip=data.msg;           }       });   };  

         最后一个参数即为回调函数

 

         server代码片段举例如下:

[javascript]   view plain   copy

 

return {           http:$http,       token: '',       auth:[],       loginname: '',       login: function(loginname,password,fn){              this.http({           url: 'scripts/loginModule/services/loginOKTest.js',           method: 'GET'             })             .success( function(data){              if(data[0].success){                ...                         //调用回调方法                        fn(data[0]);             }              })             .error( function(data,header,config,status){           alert( "验证服务请求失败!");             });       }   }  


         场景二:没有传递回调函数的地方,这个时候就必须用到消息广播的机制。

 

         比如:我的controller通过server异步获取数据,这个时候我用回调函数保证取到数据后做后续操作。但是我的后续操作需要通过指令进行DOM的生成。这个时候我们是没有办法直接调用指令的link或者compile的。这个时候我们需要用到 广播$scope.$broadcast。发送广播以后,需要通过$scope.$on进行监听。

         controller代码片段举例如下:

 

[javascript]   view plain   copy

 

//通过categoryService异步取数据   categoryService.initCategory(loginname,token, function(category){           $scope.category=category;           $scope.$broadcast( "categoryLoaded");   });  

         service代码片段举例如下:

 

 

[javascript]   view plain   copy

 

initCategory: function(loginname,token,fn){        this.http({       url: 'scripts/mainModule/services/mainCategory.js',       method: 'GET'       }).success( function(data,header,config,status){          fn(data);           }).error( function(data,header,config,status){           alert( "验证服务请求失败!");       });   }  

        directive代码片段举例如下:

 

 

[javascript]   view plain   copy

 

link: function ($scope, $elem, attrs) {        $scope.$on( "categoryLoaded",  function (event, args) {                //$scope.category即为异步获取的数据        }   }  


最后,如果我们在这个controller中需要调用另外一个模块的指令的link或者compile或者另一个模块的controller怎么办。我们需要通过依赖注入$rootScope服务,因为他是所有作用域的父,然后调用 $emit 这个服务进行广播。指令中通过 $rootScope . $on 进行接收即可。

 

         模块1(app.video)中的controller代码片段举例如下:

[javascript]   view plain   copy

 

$scope.replay= function(id){       console.log( "click replay id:"+id);       clearReply();        //通过$rootScope广播消息给app.dialog模块的controller       $rootScope.$emit( "openTemplate", "reply.html");   };  


       模块2(app.dialog)中的controller代码片段举例如下:

 

 

[javascript]   view plain   copy

 

$rootScope.$on( 'openTemplate', function(event, toState, toParams, fromState, fromParams){           $scope.openTemplate(toState);   });              $scope.openTemplate =  function (url) {            if(!url)              url= "/ZVideo-MVC/dialog/defaultTemplate.html";           $scope.value =  true;           ngDialog.open({              template: url,              className:  'ngdialog-theme-plain',              scope: $scope           });   };  

查看更多关于angular系列彻底的异步解决的详细内容...

  阅读:44次